Python 如何在多进程中杀死所有池工作者?
我想停止单个工作线程的所有线程 我有一个线程池,有10个工作线程:Python 如何在多进程中杀死所有池工作者?,python,multithreading,multiprocessing,kill-process,Python,Multithreading,Multiprocessing,Kill Process,我想停止单个工作线程的所有线程 我有一个线程池,有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
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()
的工作进程。您不能这样做
即使您能够在i==20
时结束所有进程,您也无法确定只打印了20个数字,因为您的进程将以不确定的顺序执行
如果您只想运行20个进程,那么您需要从主进程(即控制循环)管理它。这不是您想要的方式,因为在辅助进程中调用
sys.exit()
只会终止辅助进程。它对父进程或其他工作进程没有影响,因为它们是独立的进程,而提升SystemExit
只会影响当前进程。您需要向父进程发回一个信号,告诉它应该关闭。为您的用例执行此操作的一种方法是使用在服务器中创建的:
输出:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
正如卢克在回答中指出的那样,这里存在一场竞赛:不能保证所有工人都能按顺序运行,因此有可能
myfunction(20,…)
会在myfunction(19,…)
之前运行。20
之后的其他工作人员也可能在主进程可以对设置的事件进行操作之前运行。在打印I
之前,我通过添加if not event.is_set():
调用减小了竞赛窗口的大小,但它仍然存在。@RajanChaudan输入错误!我现在已经修好了。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20