gpt4 book ai didi

python - 线程和进程混合的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:00 26 4
gpt4 key购买 nike

我正在运行以下 python 代码:

import threading
import multiprocessing

def forever_print():
while True:
print("")

def main():
t = threading.Thread(target=forever_print)
t.start()
return


if __name__=='__main__':
p = multiprocessing.Process(target=main)
p.start()
p.join()
print("main process on control")

它终止了。

当我从新进程中解包 main 并直接运行它时,如下所示:

if name == '__main__':
main()

脚本会一直持续下去,正如我所想的那样。我假设 t 是一个非守护进程,p 在第一种情况下不应该停止,我的假设是错误的吗?

我基本上设置了这个小测试,因为我一直在开发一个应用程序,其中线程在子进程中产生,并且它一直显示出一些奇怪的行为(有时它正确终止,有时它没有)。我想我想知道的是,从更广泛的意义上讲,混合这两个 python 库时是否存在某种“陷阱”。

我的运行环境:python 2.7 @ Ubuntu 14.04 LTS

最佳答案

目前, multiprocessing 工作进程创建的线程在进程终止方面表现得像守护线程:工作进程退出而不等待它创建的线程终止。这是由于工作进程使用 os._exit() 关闭,它跳过了大多数正常的关闭处理(特别是跳过了正常的退出处理代码(sys.exit()) .join() 的非守护程序 threading.Thread

最简单的解决方法是让工作进程显式.join()它们创建的非守护线程。

有一个关于此行为的公开错误报告,但没有取得太大进展:http://bugs.python.org/issue18966

关于python - 线程和进程混合的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39520236/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com