请教一下大佬多进程的超时问题

2021-06-10 17:26:48 +08:00
 fmdxx1991
import time
import random
from multiprocessing import Pool
def fun(name):
    print(f'{name} 运行')
    time.sleep(random.randrange(5,15))
    print(f'{name} 运行结束')

if __name__ == '__main__':
    pool = Pool(processes=2)
    names = ['anne','alice','biantai','haha']
    for name in names:
        pool.apply_async(fun,(name,))
    pool.close()
    pool.join()
    print('主线程')

我想要如果进程时间超过 10s 就结束掉,打印超时提示,然后让新进程执行,超时的进程放后面再执行,最后让所有的进程都在 10s 内成功运行完成,有什么优雅的方法吗?

1400 次点击
所在节点    Python
2 条回复
zhengxiaowai
2021-06-11 01:06:25 +08:00
https://docs.python.org/zh-cn/3/library/multiprocessing.html#using-a-pool-of-workers

有 timeout 参数,会抛出异常,另外 "最后让所有的进程都在 10s 内成功运行完成" 你得有足够的进程数量
fmdxx1991
2021-06-11 09:48:29 +08:00
@zhengxiaowai 这个用 get 尝试过,发现同时运行 2 个子进程的时候,用 get(timeout)会堵塞主进程,直到超时才会执行下一步,这个就有问题了

``` python
for name in names:
p = pool.apply_async(fun,(name,))
p.get(timeout=10)
```


这样写的话,就是每次运行一个进程,然后等待超时,那就没必要用多进程了

放外面的话, 也有很大的问题....

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/782697

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX