您明确请求了ThreadPool,而不是Pool。这意味着,multiprocessing代码将创建一个本地线程(在您自己的进程中)。在
ThreadPool实例不能突然终止,因为没有为此定义的机制(相对于进程,系统可以调用os.kill)。在您的代码中,.terminate指令最终被忽略。实际上,它设置了一个标志,当任务返回时池实例将检查该标志,但您的任务永远不会返回。我们可以从修订版中看到:import argparse
import sys
import time
from multiprocessing.pool import Pool, ThreadPool
def task(arg):
for i in range(3):
print("Working on", arg, "with i =", i)
time.sleep(1)
def main():
parser = argparse.ArgumentParser()
parser.add_argument(' delay', default=1, type=float)
args = parser.parse_args()
thread_pool = ThreadPool(processes=1)
thread_pool.apply_async(task, (0,))
thread_pool.apply_async(task, (1,))
time.sleep(args.delay)
print("Terminating")
thread_pool.terminate()
print("Termination: Initiated")
thread_pool.join() # Does not return.
print("Termination: Done")
if __name__ == '__main__':
try:
sys.exit(main())
except KeyboardInterrupt:
sys.exit('\nInterrupted')
它在不带参数的情况下执行此操作:
^{pr2}$
当使用delay 5运行时:$ python3 tp.py delay 5
Working on 0 with i = 0
Working on 0 with i = 1
Working on 0 with i = 2
Working on 1 with i = 0
Working on 1 with i = 1
Terminating
Working on 1 with i = 2
Termination: Initiated
Termination: Done
或者,如果您只使用Pool而不是ThreadPool,那么您将得到一个真正的进程,并且可以在任何时候对其使用.terminate(对通常关于搞砸通信队列的警告进行模化)。在