2016-12-02 100 views
0

我寫了一個Python腳本,它使用GCC和dockross在Windows和Linux上構建一個 應用程序。因爲我想加快構建代碼的時間,所以我使用線程模塊來實現所有四個構建過程(Linux和Windows,32和64位)。Python線程中的信號或互斥

但我發現兩個GCC構建對象(對於Linux 32位和64位)處於競爭狀態。如果我想同時做兩個建築物,會發生一些錯誤,並且在dockcross建築過程中也會發生同樣的情況。

兩個dockcross建築對象處於競賽狀態。

是否有任何函數或模塊我可以在Python中用於我 將兩個線程實現爲一個耦合線程,當一個線程完成時,它會發信號給它的耦合線程來啓動?

像下面的代碼一樣,我希望worker [0]和worker [1]具有信號機制,並且還需要worker [2]和worker [3]之間的信號機制。

def main(): 

linux32_builder = builder(
    "linux32", "make CFLAGS=-m32 all", "./", "./", "/root/crossCompile/releaseFolder/") 

linux64_builder = builder(
    "linux64", "make all", "./", "./", "/root/crossCompile/releaseFolder/") 

win64_builder = builder(
    "win64", "dockcross-windows-x64 make all", "./", "./", "/root/crossCompile/releaseFolder/") 
win32_builder = builder(
    "win32", "dockcross-windows-x86 make all", "./", "./", "/root/crossCompile/releaseFolder/") 

# linux32_builder.copySourceCodeFromShare() 
Worker = [] 
Worker.append(Make_Thread(1, linux32_builder)) 
Worker.append(Make_Thread(2, linux64_builder)) 
Worker.append(Make_Thread(3, win64_builder)) 
Worker.append(Make_Thread(4, win32_builder)) 

for i in Worker: 
    i.start() 
    i.join() 

回答

1

在Python中,thread.join()阻塞直到線程終止。我相信你的代碼示例不會並行地運行線程,而是等待每個線程在開始下一個之前終止。您可能需要驗證每個線程在實際構建過程完成之前未終止,否則您可能仍存在競爭條件。 (我假設這個版本使用外部進程。)

假設你的各種_builder對象是函數,並且Make_Thread使用它們作爲主線程函數,我建議使用順序執行而不是線程來獲得所需的效果。

的代碼可能看起來是這樣的:(我在數字參數Make_Thread猜測)

linux = Make_Thread(1, lambda: linux32_builder(), linux64_builder()) 
windows = Make_Thread(2, lambda: win32_builder(), win64_builder()) 
linux.start() 
windows.start() 
linux.join() 
windows.join() 

的lambda表達式實際上返回記錄,但它保證了施工人員將按順序從左至右調用。

或者,除了代碼中顯示的四個線程外,還可以創建兩個線程,並且這兩個線程可以分別控制兩個其他線程。 Linux的構造器線程的主要功能將類似於:

def linux(): 
    Worker[0].start() 
    Worker[1].start() 
    Worker[0].join() 
    Worker[1].join() 

和Windows的構造器線程的主要功能如下所示:

def windows(): 
    Worker[2].start() 
    Worker[3].start() 
    Worker[2].join() 
    Worker[3].join() 

你可以這樣開始每兩個控制線,最後加入他們。這種方法更復雜,代碼更多,線程更多。

+0

嗨Cris, 我發現我的問題是對每個線程我改變工作目錄,這將導致問題,因爲工作目錄是一個進程的全局變量。所以我把我的工具改爲多進程,現在它工作得很好。這個腳本是關於交叉編譯的。 我的工作流程在[這裏](https://redliu312.github.io/cross-compile/)中有描述。 –