我想停止单个工作人员的所有线程。
我有一个有 10 个工作线程的线程池:
def myfunction(i):
print(i)
if (i == 20):
sys.exit()
p = multiprocessing.Pool(10, init_worker)
for i in range(100):
p.apply_async(myfunction, (i,))
我的程序不会停止,其他进程会继续工作,直到所有 100 次迭代完成。我想从调用的线程内部完全停止池sys.exit()
。目前的编写方式只会停止调用的工作程序sys.exit()
.
这没有按照你想要的方式工作,因为调用sys.exit()
在工作进程中只会终止工作进程。它对父进程或其他工作人员没有影响,因为它们是单独的进程并引发SystemExit
只影响当前进程。您需要向父进程发送回信号,告诉它应该关闭。针对您的用例执行此操作的一种方法是使用Event创建于multiprocessing.Manager server:
import multiprocessing
def myfunction(i, event):
if not event.is_set():
print i
if i == 20:
event.set()
if __name__ == "__main__":
p= multiprocessing.Pool(10)
m = multiprocessing.Manager()
event = m.Event()
for i in range(100):
p.apply_async(myfunction , (i, event))
p.close()
event.wait() # We'll block here until a worker calls `event.set()`
p.terminate() # Terminate all processes in the Pool
Output:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
正如卢克的回答中指出的,这里有一场竞赛:不能保证所有工人都会按顺序运行,因此有可能myfunction(20, ..)
将在之前运行myfuntion(19, ..)
, 例如。也有可能其他工人之后20
将在主进程对所设置的事件采取行动之前运行。我通过添加以下内容来减小比赛窗口的大小if not event.is_set():
打印前致电i
,但它仍然存在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)