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()
然后您将启动这两个控制线程中的每一个并最终加入它们。这种方式比较复杂,代码多,线程多。
我写了一个 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()
然后您将启动这两个控制线程中的每一个并最终加入它们。这种方式比较复杂,代码多,线程多。