python结束某个线程_一旦Python的一个工作线程满足某个条件,就终止它的多处理程序...

任何进程都无法阻止类似于大锤的暴力。别去那儿。

要明智地做到这一点,您需要重新设计您的基本方法:主流程和工作流程需要相互通信。

我想充实一下,但到目前为止的例子是也没有什么用处。例如,如前所述,对rand()的调用不超过num_workers,因此没有理由相信其中任何调用必须是>0.7。

一旦worker函数增长了一个循环,它就变得更加明显。例如,工作者可以检查是否在循环的顶部设置了mp.Event,如果设置了,则退出。主进程将在希望工人停止时设置Event。

当工人发现一个值>0.7时,他可以设置一个不同的mp.Event。主进程将等待Event,然后设置“停止时间”Event供工作人员查看,然后执行常规的循环.join()-让工作人员进行干净的关闭。

编辑

假设工人们将继续工作,直到至少有人找到一个值>0.7,这里将充实出一个便携、干净的解决方案。请注意,我从中删除了numpy,因为它与此代码无关。这里的代码在任何支持multiprocessing的平台上的任何股票Python下都应该可以正常工作:import random

from time import sleep

def worker(i, quit, foundit):

print "%d started" % i

while not quit.is_set():

x = random.random()

if x > 0.7:

print '%d found %g' % (i, x)

foundit.set()

break

sleep(0.1)

print "%d is done" % i

if __name__ == "__main__":

import multiprocessing as mp

quit = mp.Event()

foundit = mp.Event()

for i in range(mp.cpu_count()):

p = mp.Process(target=worker, args=(i, quit, foundit))

p.start()

foundit.wait()

quit.set()

以及一些示例输出:0 started

1 started

2 started

2 found 0.922803

2 is done

3 started

3 is done

4 started

4 is done

5 started

5 is done

6 started

6 is done

7 started

7 is done

0 is done

1 is done

一切都会干净地关闭:没有回溯,没有异常终止,没有留下僵尸进程。。。干净利落。

杀了它

正如@nosdafox所指出的,有一个Pool.terminate()方法尽其所能,跨平台杀死工作进程,不管它们在做什么(例如,在Windows上,它调用平台TerminateProcess())。我不建议在生产代码中使用它,因为突然终止进程可能会使各种共享资源处于不一致的状态,或者让它们泄漏。在multiprocessing文档中有各种关于这个的警告,您应该在其中添加操作系统文档。

不过,这可能是权宜之计!这是一个使用这种方法的完整程序。请注意,我将截止值提高到了0.95,使运行此操作比运行一个眼球链接更可能需要更长的时间:import random

from time import sleep

def worker(i):

print "%d started" % i

while True:

x = random.random()

print '%d found %g' % (i, x)

if x > 0.95:

return x # triggers callback

sleep(0.5)

# callback running only in __main__

def quit(arg):

print "quitting with %g" % arg

# note: p is visible because it's global in __main__

p.terminate() # kill all pool workers

if __name__ == "__main__":

import multiprocessing as mp

ncpu = mp.cpu_count()

p = mp.Pool(ncpu)

for i in range(ncpu):

p.apply_async(worker, args=(i,), callback=quit)

p.close()

p.join()

以及一些示例输出:$ python mptest.py

0 started

0 found 0.391351

1 started

1 found 0.767374

2 started

2 found 0.110969

3 started

3 found 0.611442

4 started

4 found 0.790782

5 started

5 found 0.554611

6 started

6 found 0.0483844

7 started

7 found 0.862496

0 found 0.27175

1 found 0.0398836

2 found 0.884015

3 found 0.988702

quitting with 0.988702

4 found 0.909178

5 found 0.336805

6 found 0.961192

7 found 0.912875

$ [the program ended]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值