有人可以帮助我了解在 python 进程中使用线程的限制吗?
我附上了我想要实现的目标的最小工作示例。我的用例要求我启动多个进程,并且在每个进程中我有两个需要通信的线程。然而,即使在下面非常简单的示例中,我似乎也遇到了死锁/争用,并且根本不清楚出了什么问题。
import multiprocessing
from threading import Thread
import logging
import time
import sys
def print_all_the_things(char, num):
try:
while True:
sys.stdout.write(char + str(num))
except Exception:
logging.exception("Something went wrong")
class MyProcess(multiprocessing.Process):
def __init__(self, num):
super(MyProcess, self).__init__()
self.num = num
def run(self):
self.thread1 = Thread(target=print_all_the_things, args=("a", self.num))
self.thread2 = Thread(target=print_all_the_things, args=("b", self.num))
self.thread1.start()
self.thread2.start()
procs = {}
for a in range(2):
procs[a] = MyProcess(a)
procs[a].start()
time.sleep(5)
for a in range(2):
procs[a].join()
预期输出是标准输出上“a”、“b”、“1”和“2”的混杂。然而程序很快就陷入死锁:
$python mwe.py
a0a0a0a0a0a0b0b0a0a0b0b0b0b0b0b0b0b0b0b0a0a0a0a0a0a0a0a1a1a2a2a2a2a2b2b2a2
我应该指出,将 MyProcess 更改为从 Thread 继承会产生一个工作示例。
我究竟做错了什么?
2个进程启动,他们启动他们的线程,然后他们应该
退出,因为没有更多说明run()
。
但线程仍处于一种僵尸状态,因为“守护进程”
尚未设置标志(请参阅有关此的 Python 文档),防止
2个进程正确终止。
就做run()
方法在线程启动后没有完成,
例如,您可以等待退出条件:
class MyProcess(multiprocessing.Process):
def __init__(self, num, exit_cond): ### new code
super(MyProcess, self).__init__()
self.num = num
self.exit_cond = exit_cond ### new code
def run(self):
self.thread1 = Thread(target=print_all_the_things, args=("a", self.num))
self.thread2 = Thread(target=print_all_the_things, args=("b", self.num))
self.thread1.daemon=True ### new code
self.thread2.daemon=True ### new code
self.thread1.start()
self.thread2.start()
self.exit_cond.wait() ### new code
procs = {}
exit_cond = multiprocessing.Event() ### new code
for a in range(2):
procs[a] = MyProcess(a, exit_cond)
procs[a].start()
time.sleep(5)
exit_cond.set() ### new code
for a in range(2):
procs[a].join()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)