Discuss / Python / 为什么先打印 'Waiting for all subprocesses done...',再执行子进程?

为什么先打印 'Waiting for all subprocesses done...',再执行子进程?

Topic source

乐乐吧吧

#1 Created at ... [Delete] [Delete and Lock User]

请教大神:

def long_time_task(name):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('Task %s runs %0.2f seconds.' % (name, (end - start)))

if __name__=='__main__':
    print('Parent process %s.' % os.getpid())
    p = Pool(4)
    for i in range(5):
        p.apply_async(long_time_task, args=(i,))
    print('Waiting for all subprocesses done...')
    p.close()
    p.join()
    print('All subprocesses done.')

这个示例里,为什么结果是先打印了“Waiting for all subprocesses done...",再打印:

Run task 0 (671)...
Run task 1 (672)...
Run task 2 (673)...
Run task 3 (674)...

另外,为什么执行完‘Waiting for all subpresses done'这句打印,再回头Run task 4呢?我的理解是:此时已经跳出了 for 循环,打印完'waiting...'这句,不是直接到p.close()了吗?进程执行的过程是怎样的?百思不得其解,求大神指导!

乐乐吧吧

#2 Created at ... [Delete] [Delete and Lock User]

懂了,如下,如果主进程增加 time.sleep(10),看到打印结果就不一样了。即,主进程,与子进程都是并行启动,主要看执行的时间分配了。:)

    for i in range(5):

        p.apply_async(long_time_task, args=(i,))

**    time.sleep(10)**

    print('Waiting for all subprocesses done...')

    p.close()

结果:

Parent process 16852.

Run task 0 (11524)...

Run task 1 (11524)...

Run task 2 (11524)...

Run task 3 (11524)...

Run task 4 (11524)...

Waiting for all subprocesses done...

All subprocesses done.


  • 1

Reply