2016-12-02 12 views
0

GCCとドックロスを使用して、WindowsおよびLinux上で アプリケーションをクロスビルドするPythonスクリプトを作成しました。ビルドコードの時間を短縮したいので、私はスレッドモジュールを使って4つの構築プロセス(LinuxとWindows、32と64ビット)を実装します。Pythonスレッディングのシグナルまたはミューテックス

しかし、2つのGCCビルディングオブジェクト(Linux 32ビットと64ビット)が競合状態にあることがわかりました。同時に2つの建物をやりたい場合は、いくつかのエラーが発生し、同じ状況がドッククロス構築プロセスで発生します。

2つのドッククロス構築オブジェクトは競合状態にあります。

私はPythonで の2つのスレッドを結合スレッドとして実装することができる関数やモジュールはありますか?1つのスレッドが終了すると、その結合スレッドにシグナルが送られますか?

以下のコードと同様に、私は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() 

ラムダ式は、実際にはタプルを返すが、それはビルダーがすることが保証されています左から順に呼び出されます。

また、コードに示されている4つのスレッドに加えて2つのスレッドを作成することもできます。これらの2つのスレッドはそれぞれ別のスレッドの2つを制御できます。

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() 

あなたはこれら2つの制御スレッドのそれぞれを開始し、最終的に参加するだろう、Linuxのビルダーは、主な機能は次のようになりますスレッドそれら。このアプローチは、より多くのコードとスレッドを使用して、より複雑になります。

+0

こんにちはCris、 私の問題はすべてのスレッドで発生しています。作業ディレクトリは1つのプロセスのグローバル変数であるため、問題が発生します。だから、私は実装をマルチプロセスに変更しました。このスクリプトはクロスコンパイルに関するものです。 私のワークフローは、[ここ](https://redliu312.github.io/cross-compile/)に記載されています。 –