Python 线程中的信号或互斥锁

Signal or mutex in Python threading

我写了一个 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()

在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表达式实际上return个元组,但保证构建器会按从左到右的顺序被调用。

或者,除了代码中显示的四个线程之外,您还可以创建两个线程,这两个线程可以分别控制其他两个线程。 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()

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