Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在多进程中杀死所有池工作者?_Python_Multithreading_Multiprocessing_Kill Process - Fatal编程技术网

Python 如何在多进程中杀死所有池工作者?

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

我想停止单个工作线程的所有线程

我有一个线程池,有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()

的工作进程。您不能这样做

即使您能够在
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