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