Python 进程池之非阻塞式
当需要创建的子进程数量不多时,可以直接利用multprocessing中的Process动态生成多个进程。但如果是上百甚至上千的目标,手动的去创建进程的工作量巨大,此时就可以用到multprocessing模块提供的Pool方法。初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,name就会创建一个新的进程用来执行该请求,但如果池中的进程数已经达到指定的最大
·
当需要创建的子进程数量不多时,可以直接利用multprocessing中的Process动态生成多个进程。但如果是上百甚至上千的目标,手动的去创建进程的工作量巨大,此时就可以用到multprocessing模块提供的Pool方法。初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,name就会创建一个新的进程用来执行该请求,但如果池中的进程数已经达到指定的最大值,name该请求就会等待,知道池中有进程结束,才会创建新的进程来执行。
池子有两种类型:一种是阻塞式,一种是非阻塞式。
阻塞式:添加一个执行一个,执行一个才返回紧接着添加下一个。(没有特别大的意义)
非阻塞式:全部添加到队列中,立刻返回,并没有等待他们执行完毕,当执行完毕之后会有回调中携带它的结果。
程序1
from multiprocessing import Pool
import time
import random
#非阻塞式进程
def task(task_name):
print('开始做任务了!',task_name)
start = time.time()
#使用sleep
time.sleep(random()*2)
end = time.time()
print('完成任务用时:',(end-start))
if __name__ == '__main__':
pool = Pool(5)
tasks = ['听音乐','吃饭','洗衣服','打游戏','散步','看孩子','读书','做饭']
for task in tasks:
pool.apply_async(task,args = (task,))
print('over!!!!!!!')
结果1
over!!!!!!!
程序2
from multiprocessing import Pool
import time
from random import random
#非阻塞式进程
def task(task_name):
print('开始做任务了!',task_name)
start = time.time()
#使用sleep
time.sleep(random()*2)
end = time.time()
print('完成任务!用时:',(end-start))
if __name__ == '__main__':
pool = Pool(5)
tasks = ['听音乐','吃饭','洗衣服','打游戏','散步','看孩子','读书','做饭']
for task1 in tasks:
pool.apply_async(task,args = (task1,))
pool.close() #添加任务结束
pool.join()
print('over!!!!!!!')
结果2
开始做任务了! 听音乐
开始做任务了! 吃饭
开始做任务了! 洗衣服
开始做任务了! 打游戏
开始做任务了! 散步
完成任务!用时: 0.5458700656890869
开始做任务了! 看孩子
完成任务!用时: 1.1073369979858398
开始做任务了! 读书
完成任务!用时: 0.3390927314758301
开始做任务了! 做饭
完成任务!用时: 1.6459546089172363
完成任务!用时: 1.871612310409546
完成任务!用时: 1.9256365299224854
完成任务!用时: 0.5086400508880615
完成任务!用时: 1.9110634326934814
over!!!!!!!
程序3
from multiprocessing import Pool
import time
from random import random
import os
#非阻塞式进程
def task(task_name):
print('开始做任务了!',task_name)
start = time.time()
#使用sleep
time.sleep(random()*2)
end = time.time()
print('完成任务!用时:',(end-start),'进程ID:',os.getpid()) #获得进程ID
if __name__ == '__main__':
pool = Pool(5)
tasks = ['听音乐','吃饭','洗衣服','打游戏','散步','看孩子','读书','做饭']
for task1 in tasks:
pool.apply_async(task,args = (task1,))
pool.close() #添加任务结束
pool.join() #
print('over!!!!!!!')
结果3
开始做任务了! 听音乐
开始做任务了! 吃饭
开始做任务了! 洗衣服
开始做任务了! 打游戏
开始做任务了! 散步
完成任务!用时: 0.18909358978271484 进程ID: 10544
开始做任务了! 看孩子
完成任务!用时: 0.4931068420410156 进程ID: 7024
开始做任务了! 读书
完成任务!用时: 0.6347644329071045 进程ID: 5472
开始做任务了! 做饭
完成任务!用时: 0.5653088092803955 进程ID: 10544
完成任务!用时: 0.20141983032226562 进程ID: 5472
完成任务!用时: 1.348006010055542 进程ID: 6612
完成任务!用时: 1.0501861572265625 进程ID: 7024
完成任务!用时: 1.6761057376861572 进程ID: 18536
over!!!!!!!
程序4
from multiprocessing import Pool
import time
from random import random
import os
#非阻塞式进程
def task(task_name):
print('开始做任务了!',task_name)
start = time.time()
#使用sleep
time.sleep(random()*2)
end = time.time()
print('完成任务:{}!用时:{},进程ID:{}'.format(task_name,(end - start),os.getpid()))
if __name__ == '__main__':
pool = Pool(5)
tasks = ['听音乐','吃饭','洗衣服','打游戏','散步','看孩子','读书','做饭']
for task1 in tasks:
pool.apply_async(task,args = (task1,))
pool.close() #添加任务结束
pool.join() #
print('over!!!!!!!')
结果4
开始做任务了! 听音乐
开始做任务了! 吃饭
开始做任务了! 洗衣服
开始做任务了! 打游戏
开始做任务了! 散步
完成任务:打游戏!用时:0.39394688606262207,进程ID:6652
开始做任务了! 看孩子
完成任务:散步!用时:0.8889727592468262,进程ID:22576
开始做任务了! 读书
完成任务:听音乐!用时:1.1549112796783447,进程ID:19264
开始做任务了! 做饭
完成任务:洗衣服!用时:1.7190024852752686,进程ID:1332
完成任务:读书!用时:0.7781314849853516,进程ID:22576
完成任务:吃饭!用时:1.89725661277771,进程ID:9196
完成任务:看孩子!用时:1.9234998226165771,进程ID:6652
完成任务:做饭!用时:1.804778814315796,进程ID:19264
over!!!!!!!
更多推荐
已为社区贡献4条内容
所有评论(0)