time模块的sleep函数不是使进程挂起吗,进程挂起后不是释放cpu吗,为什么task0-task3挂起时task4不会执行

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.

阅读 5.4k
1 个回答

因为你的进程池的大小是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...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题