1
Fizzyi OP 我认为我的程序已经是执行完毕了的,因为我每个子进程结束后有会标记。 退一步来说,如果是我的某个进程没有结束,那如何观察是卡在哪里了呢
|
2
tiedan 2019-07-24 19:47:11 +08:00
这个场景考虑 gdb 来调试
|
3
arrow8899 2019-07-24 20:41:24 +08:00
print 大法好
|
4
ClericPy 2019-07-24 21:20:33 +08:00
不给代码的盲改... 现在都流行这个了么, 靠猜的话, 我猜你没 join
|
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) |
6
fghjghf 2019-07-25 08:46:55 +08:00
process:都是先执行父进程,再到子进程。子进程不退出,父进程就会等他结束后再结束。join 堵塞的意思,写了这个,那就卡住了,要执行完才会往下走。用这个的话,就可以控制顺序:先执行子进程,再执行主进程。这样说你理解了吧?多跑下官方的 demo 你就知道了
|
7
wuwukai007 2019-07-25 09:07:31 +08:00
第一:使用进程池,进程任务出现错误不会再主进程中显示,就是子进程出错,子进程结束,主进程继续,如果要捕获子进程错误,自己写个错误收集的装饰器,
|
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() |
9
www5070504 2019-07-25 09:33:22 +08:00
target 函数是循环 or 阻塞的?
|