Python线程中的信号或互斥

时间:2016-12-02 19:27:26

标签: python multithreading race-condition

我编写了一个Python脚本,它使用GCC和dockross来交叉构建 Windows和Linux上的应用程序。因为我想加快构建代码所花费的时间,所以我使用线程模块来实现所有四个构建过程(Linux和Windows,32位和64位)。

但我发现两个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 个答案:

答案 0 :(得分:1)

在Python中,thread.join()会阻塞,直到线程终止。我相信你的代码示例并不是并行运行线程,而是等待每个线程在开始下一个之前终止。您可能希望验证每个线程在实际构建过程完成之前是否未终止,否则您可能仍然存在竞争条件。 (我认为构建使用外部进程。)

假设您的各种_builder对象是函数,并且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()

(我猜测Make_Thread的数字参数。)

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

然后,您将启动这两个控制线程中的每一个,最后加入它们。这种方法更复杂,代码更多,线程更多。