为了账号安全,请及时绑定邮箱和手机立即绑定

满足条件时终止多处理进程

满足条件时终止多处理进程

湖上湖 2021-10-12 17:27:16
我试图运行的想法是这样的:运行 3 个进程进行计算一旦 3 个进程之一完成任务立即杀死其他进程并继续执行主要任务,我不能让它再运行了我尝试过的事情是:通过 multiprocessing.manager 放置全局变量,但这仍然让进程完成它们的循环。引发异常操作系统:Windows 蟒蛇:2.7def f(name):    Doing = True    try:        while Doing:            print 'DOING',name            somecodethatmarksDoingAsFalse()    except Exception as error:        print 'bye'        print error        Doing = False        return Trueif __name__ == '__main__':    p = multiprocessing.Process(target=f, args=('bob',))    p2 = multiprocessing.Process(target=f, args=('tom',))    p.start()    p2.start()    p.join()    p2.join()    raise Exception('I know Python!')    sys.exit()我希望能够在将执行标记为 false、引发异常或在对其中一个进程进行计算时以任何方式终止所有进程编辑:它不是重复的,因为它仍然完成执行代码,例如请求模块仍然发送数据
查看完整描述

1 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

如果您需要立即杀死,您可以使用 amultiprocessing.Event通知父进程满足条件并让它立即杀死工作进程。管理器进程对于这种需要的少量同步来说太重了。


import os

from datetime import datetime

from multiprocessing import Process, Event



def worker(range_, target, found_event):

    print('{} | pid: {} started'.format(datetime.now(), os.getpid()))

    for x in range_:

        if x == target:

            print('{} | pid: {} found target'.format(

                datetime.now(), os.getpid())

            )

            found_event.set()



if __name__ == "__main__":


    N_WORKERS = 4


    step = int(200e6)

    ranges = [range(x, x + step) # change `range` to `xrange` for Python 2

              for x in range(0, N_WORKERS * step, step)]

    # range(0, 200000000), ..., range(800000000, 1000000000)]

    target = int(150e6)  # <-- worker finding this value triggers massacre

    found_event = Event()


    pool = [Process(target=worker, args=(range_, target, found_event))

            for range_ in ranges]


    for p in pool:

        p.start()


    found_event.wait()  # <- blocks until condition met

    print('{} | terminating processes'.format(datetime.now()))

    for p in pool:

        p.terminate()

    for p in pool:

        p.join()

    print('{} | all processes joined'.format(datetime.now()))

示例输出:


2019-01-17 01:55:33.781884 | pid: 28376 started

2019-01-17 01:55:33.782333 | pid: 28377 started

2019-01-17 01:55:33.782851 | pid: 28378 started

2019-01-17 01:55:33.783484 | pid: 28379 started

2019-01-17 01:55:54.715425 | pid: 28376 found target

2019-01-17 01:55:54.715613 | terminating processes

2019-01-17 01:55:54.716326 | all processes joined


Process finished with exit code 0


查看完整回答
反对 回复 2021-10-12
  • 1 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信