栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

一旦其中一个工人满足特定条件,终止Python多处理程序

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一旦其中一个工人满足特定条件,终止Python多处理程序

os.kill()
像大锤一样,没有任何方法可以阻止其他短小的暴力。不要去那

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

我会充实它,但是到目前为止,该示例
简单了,无法使用。例如,按照书面规定,最多

num_workers
只能
rand()
进行调用,因此没有理由相信其中任何一个必须大于0.7。

一旦worker函数增长了一个循环,它就会变得更加明显。例如,工作人员可以检查

mp.Event
循环顶部是否设置了,如果退出则直接退出。主要过程将设置
Event
希望工人停止的时间。

当工人

mp.Event
发现值>
0.7时,可以设置一个不同的值。主要过程将等待该事件
Event
,然后设置“停止时间”
Event
以供工作人员查看,然后执行通常的循环-
.join()
使工作人员彻底关闭。

编辑

假设工人要继续努力,直到至少有人发现一个值>
0.7,这才是一种充实,干净的解决方案。请注意,我已将其删除

numpy
,因为它与这段代码无关。在任何支持
multiprocessing
以下平台的库存Python下,此处的代码都可以正常工作:

import randomfrom time import sleepdef 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" % iif __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 started1 started2 started2 found 0.9228032 is done3 started3 is done4 started4 is done5 started5 is done6 started6 is done7 started7 is done0 is done1 is done

一切都彻底关闭:没有回溯,没有异常终止,没有留下僵尸进程……像哨子一样干净。

杀了它

正如@noxdafox所指出的,有一种

Pool.terminate()
方法可以在所有平台上尽其所能来杀死工作进程,无论它们在做什么(例如,在Windows上称为平台
TerminateProcess()
)。我不建议将其用于生产代码,因为突然终止进程可能会使各种共享资源处于不一致状态,或者使它们泄漏。在
multiprocessing
文档中有关于此的各种警告,您应该在其中添加OS文档。

不过,这可能很方便!这是使用此方法的完整程序。请注意,我将临界值提高到0.95,以使其花费的时间比眨眼的时间更长:

import randomfrom time import sleepdef 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 workersif __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.py0 started0 found 0.3913511 started1 found 0.7673742 started2 found 0.1109693 started3 found 0.6114424 started4 found 0.7907825 started5 found 0.5546116 started6 found 0.04838447 started7 found 0.8624960 found 0.271751 found 0.03988362 found 0.8840153 found 0.988702quitting with 0.9887024 found 0.9091785 found 0.3368056 found 0.9611927 found 0.912875$ [the program ended]


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639539.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号