2016-12-02 102 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/)中有描述。 –