Python多处理帮助有条件退出

Python多处理帮助有条件退出,第1张

Python多处理帮助有条件退出

也许您正在寻找这样的东西?请记住,我正在为Python 3编写。上面的打印语句是Python 2,在这种情况下,应注意的是使用xrange而不是range。

from argparse import ArgumentParserfrom random import randomfrom subprocess import Popenfrom sys import exitfrom time import sleepdef add_something(i):    # Sleep to simulate the long calculation    sleep(random() * 30)    return i + 1def run_my_process():    # Start up all of the processes, pass i as command line argument    # since you have your function in the same file, we'll have to handle that    # inside 'main' below    processes = []    for i in range(100):        processes.append(Popen(['python', 'thisfile.py', str(i)]))    # Wait for your desired process result    # Might want to add a short sleep to the loop    done = False    while not done:       for proc in processes: returnpre = proc.poll() if returnpre == 90:     done = True     break    # Kill any process that are still running    for proc in processes:        if proc.returnpre is None: # Might run into a race condition here, # so might want to wrap with try block proc.kill()if __name__ == '__main__':    # Look for optional i argument here    parser = ArgumentParser()    parser.add_argument('i', type=int, nargs='?')    i = parser.parse_args().i    # If there isn't an i, then run the whole thing    if i is None:        run_my_process()    else:        # Otherwise, run your expensive calculation and return the result        returnpre = add_something(i)        print(returnpre)        exit(returnpre)

编辑:

这是一个使用多处理模块而不是子进程的更干净的版本

from random import randomfrom multiprocessing import Processfrom sys import exitfrom time import sleepdef add_something(i):    # Sleep to simulate the long calculation    sleep(random() * 30)    exitpre = i + 1    print(exitpre)    exit(exitpre)def run_my_process():    # Start up all of the processes    processes = []    for i in range(100):        proc = Process(target=add_something, args=[i])        processes.append(proc)        proc.start()    # Wait for the desired process result    done = False    while not done:        for proc in processes: if proc.exitpre == 90:     done = True     break    # Kill any processes that are still running    for proc in processes:        if proc.is_alive(): proc.terminate()if __name__ == '__main__':    run_my_process()

编辑2:

这是最后一个版本,我认为它比其他两个版本要好得多:

from random import randomfrom multiprocessing import Poolfrom time import sleepdef add_something(i):    # Sleep to simulate the long calculation    sleep(random() * 30)    return i + 1def run_my_process():    # Create a process pool    pool = Pool(100)    # Callback function that checks results and kills the pool    def check_result(result):        print(result)        if result == 90: pool.terminate()    # Start up all of the processes    for i in range(100):        pool.apply_async(add_something, args=[i], callback=check_result)    pool.close()    pool.join()if __name__ == '__main__':    run_my_process()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5632511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存