from multiprocessing import Pool
import os, time, random
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.')
输出结果:
Parent process 669.
Waiting for all subprocesses done...
Run task 0 (671)...
Run task 1 (672)...
Run task 2 (673)...
Run task 3 (674)...
Task 2 runs 0.14 seconds.
Run task 4 (673)...
Task 1 runs 0.27 seconds.
Task 3 runs 0.86 seconds.
Task 0 runs 1.41 seconds.
Task 4 runs 1.91 seconds.
All subprocesses done.
因为你的进程池的大小是4
p = Pool(4)
,有四个子进程,分别跑task 0~task 3其中Task 2 runs 0.14 seconds.结束了,进程被释放,所以有一个空闲进程,task4就执行了Run task 4 (673)...因为你用的apply_async
参考https://docs.python.org/3/lib...
It blocks until the result is ready.文档写的他会阻塞直到返回数据,所以sleep不会挂起进程,会阻塞进程。
你说的sleep挂起进程的意思我猜是task0在执行sleep的时候task1也在正常执行(并行)吧,但是在task0进程内sleep应该会执行完才释放进程
如果想让进程挂起,可以考虑用
psutil.Process.suspend()
参考https://www.zhihu.com/questio...