问题:为啥多传一个 queue 参数,子任务函数 perform_task(), 没有执行?
代码如下:
from multiprocessing import Pool, Queue
from time import time, sleep
import random
def perform_task(id, queue):
print(" [{}号] 子进程 [开始] 执行任务".format(id))
begin = time()
sleep(random.random() * 5)
print(" [{}号] 子进程 [结束] 执行任务".format(id))
end = time()
cost = end - begin
res = " [{}号] 子进程执行任务耗时:{}".format(id, cost)
queue.put(res)
print(res)
if __name__ == "__main__":
# 进程结果集
queue = Queue()
# 进程池中进程最大数量
pool_count = 5
# 创建进程池
pool = Pool(pool_count)
print("进程池准备就绪, 多进程开始执行任务,等待结束...")
#
for i in range(pool_count):
pool.apply_async(perform_task, args=(i, queue) )
# 关闭进程池,使其不再接受新的任务
pool.close()
# 主进程阻塞机制
pool.join()
print("所有进程池中的任务完成")
正常结果应该是:
进程池准备就绪, 多进程开始执行任务,等待结束...
[ 0 号] 子进程 [开始] 执行任务
[ 1 号] 子进程 [开始] 执行任务
[ 2 号] 子进程 [开始] 执行任务
[ 3 号] 子进程 [开始] 执行任务
[ 4 号] 子进程 [开始] 执行任务
[ 3 号] 子进程 [结束] 执行任务
[ 3 号] 子进程执行任务耗时:0.24634218215942383
[ 4 号] 子进程 [结束] 执行任务
[ 4 号] 子进程执行任务耗时:0.41087770462036133
[ 2 号] 子进程 [结束] 执行任务
[ 2 号] 子进程执行任务耗时:0.8377587795257568
[ 1 号] 子进程 [结束] 执行任务
[ 1 号] 子进程执行任务耗时:2.044529914855957
[ 0 号] 子进程 [结束] 执行任务
[ 0 号] 子进程执行任务耗时:2.7406675815582275
所有进程池中的任务完成
代码如下:
from multiprocessing import Pool, Queue
from time import time, sleep
import random
def perform_task(id, queue):
print(" [{}号] 子进程 [开始] 执行任务".format(id))
begin = time()
sleep(random.random() * 5)
print(" [{}号] 子进程 [结束] 执行任务".format(id))
end = time()
cost = end - begin
res = " [{}号] 子进程执行任务耗时:{}".format(id, cost)
queue.put(res)
print(res)
if __name__ == "__main__":
# 进程结果集
queue = Queue()
# 进程池中进程最大数量
pool_count = 5
# 创建进程池
pool = Pool(pool_count)
print("进程池准备就绪, 多进程开始执行任务,等待结束...")
#
for i in range(pool_count):
pool.apply_async(perform_task, args=(i, queue) )
# 关闭进程池,使其不再接受新的任务
pool.close()
# 主进程阻塞机制
pool.join()
print("所有进程池中的任务完成")
正常结果应该是:
进程池准备就绪, 多进程开始执行任务,等待结束...
[ 0 号] 子进程 [开始] 执行任务
[ 1 号] 子进程 [开始] 执行任务
[ 2 号] 子进程 [开始] 执行任务
[ 3 号] 子进程 [开始] 执行任务
[ 4 号] 子进程 [开始] 执行任务
[ 3 号] 子进程 [结束] 执行任务
[ 3 号] 子进程执行任务耗时:0.24634218215942383
[ 4 号] 子进程 [结束] 执行任务
[ 4 号] 子进程执行任务耗时:0.41087770462036133
[ 2 号] 子进程 [结束] 执行任务
[ 2 号] 子进程执行任务耗时:0.8377587795257568
[ 1 号] 子进程 [结束] 执行任务
[ 1 号] 子进程执行任务耗时:2.044529914855957
[ 0 号] 子进程 [结束] 执行任务
[ 0 号] 子进程执行任务耗时:2.7406675815582275
所有进程池中的任务完成