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
Fizzyi
V2EX  ›  Python

关于 Python 中多进程的问题,求大佬解答

  •  
  •   Fizzyi · 2019-07-24 16:32:26 +08:00 · 1923 次点击
    这是一个创建于 1976 天前的主题,其中的信息可能已经有所发展或是发生改变。
    通过 multiprocessing 创建的进程池,但是现在的问题是程序执行完毕之后不不退出程序,在 pycharm 上还是运行的状态,但是什么也不打印,就一直卡着不结束,除非手动结束掉,求各位大佬解答下。
    pool = multiprocessing.Pool(processes=5)
    for i in content:
    # task(i)
    # 维持执行的进程总数为 processes,当一个进程执行完毕后会添加新的进程进去
    pool.apply_async(func=task, args=(i,))
    pool.close()
    9 条回复    2019-07-25 09:33:22 +08:00
    Fizzyi
        1
    Fizzyi  
    OP
       2019-07-24 16:33:23 +08:00
    我认为我的程序已经是执行完毕了的,因为我每个子进程结束后有会标记。 退一步来说,如果是我的某个进程没有结束,那如何观察是卡在哪里了呢
    tiedan
        2
    tiedan  
       2019-07-24 19:47:11 +08:00
    这个场景考虑 gdb 来调试
    arrow8899
        3
    arrow8899  
       2019-07-24 20:41:24 +08:00
    print 大法好
    ClericPy
        4
    ClericPy  
       2019-07-24 21:20:33 +08:00
    不给代码的盲改... 现在都流行这个了么, 靠猜的话, 我猜你没 join
    shicheng1993
        5
    shicheng1993  
       2019-07-24 22:24:14 +08:00
    我也是小白,我来说点意见,也不知道自己对不对,错了请大家指出,apply_async() 是非阻塞的,你主进程不会停在这句话上的,直接运行到这段代码下面去了,而子进程才刚被调用开始执行。
    为什么不用 pool.map((func=task, args=(i,))
    子进程运行的时候,阻塞住主进程,等待所有子进程完成,返回运行结果的 list,代码执行才往下走。
    下面再处理子进程的结果,然后 pool.close()
    如果你本身就是要求不管子进程执行完没有,那就不是我说的情况了,join 子进程或者子进程 sys.exit(0)
    fghjghf
        6
    fghjghf  
       2019-07-25 08:46:55 +08:00
    process:都是先执行父进程,再到子进程。子进程不退出,父进程就会等他结束后再结束。join 堵塞的意思,写了这个,那就卡住了,要执行完才会往下走。用这个的话,就可以控制顺序:先执行子进程,再执行主进程。这样说你理解了吧?多跑下官方的 demo 你就知道了
    wuwukai007
        7
    wuwukai007  
       2019-07-25 09:07:31 +08:00
    第一:使用进程池,进程任务出现错误不会再主进程中显示,就是子进程出错,子进程结束,主进程继续,如果要捕获子进程错误,自己写个错误收集的装饰器,
    wuwukai007
        8
    wuwukai007  
       2019-07-25 09:10:05 +08:00
    如果想让子进程的错误在主进程中捕获并显示,最好只用最原始的方式创建进程池
    list_1 = []
    for i in range(xxx):
    m = multiprocessing.Process(target=fun,args=(,))
    list_1.append(m)
    m.start()
    for i in list_1:
    i.join()
    www5070504
        9
    www5070504  
       2019-07-25 09:33:22 +08:00
    target 函数是循环 or 阻塞的?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2561 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 00:18 · PVG 08:18 · LAX 16:18 · JFK 19:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.