python停止线程池_Python3:多处理线程池中的线程终止不起作用

您明确请求了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(对通常关于搞砸通信队列的警告进行模化)。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值