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

2019-07-24 16:32:26 +08:00
 Fizzyi
通过 multiprocessing 创建的进程池,但是现在的问题是程序执行完毕之后不不退出程序,在 pycharm 上还是运行的状态,但是什么也不打印,就一直卡着不结束,除非手动结束掉,求各位大佬解答下。
pool = multiprocessing.Pool(processes=5)
for i in content:
# task(i)
# 维持执行的进程总数为 processes,当一个进程执行完毕后会添加新的进程进去
pool.apply_async(func=task, args=(i,))
pool.close()
1828 次点击
所在节点    Python
9 条回复
Fizzyi
2019-07-24 16:33:23 +08:00
我认为我的程序已经是执行完毕了的,因为我每个子进程结束后有会标记。 退一步来说,如果是我的某个进程没有结束,那如何观察是卡在哪里了呢
tiedan
2019-07-24 19:47:11 +08:00
这个场景考虑 gdb 来调试
arrow8899
2019-07-24 20:41:24 +08:00
print 大法好
ClericPy
2019-07-24 21:20:33 +08:00
不给代码的盲改... 现在都流行这个了么, 靠猜的话, 我猜你没 join
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
2019-07-25 08:46:55 +08:00
process:都是先执行父进程,再到子进程。子进程不退出,父进程就会等他结束后再结束。join 堵塞的意思,写了这个,那就卡住了,要执行完才会往下走。用这个的话,就可以控制顺序:先执行子进程,再执行主进程。这样说你理解了吧?多跑下官方的 demo 你就知道了
wuwukai007
2019-07-25 09:07:31 +08:00
第一:使用进程池,进程任务出现错误不会再主进程中显示,就是子进程出错,子进程结束,主进程继续,如果要捕获子进程错误,自己写个错误收集的装饰器,
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
2019-07-25 09:33:22 +08:00
target 函数是循环 or 阻塞的?

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

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

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

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

© 2021 V2EX