V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
fmdxx1991
V2EX  ›  Python

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

  •  
  •   fmdxx1991 · 4 天前 · 464 次点击
    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 内成功运行完成,有什么优雅的方法吗?

    2 条回复    2021-06-11 09:48:29 +08:00
    zhengxiaowai
        1
    zhengxiaowai   4 天前
    https://docs.python.org/zh-cn/3/library/multiprocessing.html#using-a-pool-of-workers

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

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


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

    放外面的话, 也有很大的问题....
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3591 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 15ms · UTC 06:03 · PVG 14:03 · LAX 23:03 · JFK 02:03
    ♥ Do have faith in what you're doing.