龙空技术网

python的非阻塞式进程池pool.apply_async

厚积薄发爱python 148

前言:

现时咱们对“python 进程池阻塞和非阻塞”大概比较注重,朋友们都需要学习一些“python 进程池阻塞和非阻塞”的相关资讯。那么小编也在网摘上搜集了一些关于“python 进程池阻塞和非阻塞””的相关内容,希望朋友们能喜欢,你们快快来了解一下吧!

1、Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求。

2、apply_async 是异步非阻塞的,相当于不用等待当前进程执行完毕,随时根据系统调度来进行进程切换,并执行其他进程。

以下是非阻塞式进程池代码,示例如下:

from multiprocessing import Processfrom multiprocessing import Poolimport os #导入系统os模块import time #导入时间time模块import random #导入随机模块def task(taskname): print("开始做任务啦,任务名称是:",taskname) start=time.time() #设置开始时间 time.sleep(random.randint(1,2)) #设置时间的随机休眠时间 end=time.time() #设置结束时间 print("{}任务耗时{}秒,进程id:{}".format(taskname,end-start,os.getpid()))task("听音乐") #调用task函数,任务名是"听音乐"container=[] #定义container为空列表def callback_func(n): #定义回调函数callback_func,参数n是任务名 container.append(n) #容器container中自动加入刚执行的任务nif __name__=='__main__': pool=Pool(3) #设置3个进程池 tasks=['听音乐','唱歌','写作','做饭','打游戏'] #设置任务列表 for task1 in tasks: #遍历任务列表tasks里的任务task pool.apply_async(task,args=(task1,),callback=callback_func) #返回被进程调用任务task1的返回值 pool.close() # 关闭进程池,表示不能在往进程池中添加进程 pool.join() # 等待进程池中的所有进程执行完毕,必须在close()之后调用 print("OVER") #进程池结束后,打印OVER

代码运行结果如下:

开始做任务啦,任务名称是: 听音乐

听音乐任务耗时2.000056505203247秒,进程id:12968

开始做任务啦,任务名称是: 听音乐

开始做任务啦,任务名称是: 听音乐

开始做任务啦,任务名称是: 听音乐

听音乐任务耗时1.000931978225708秒,进程id:4816

听音乐任务耗时1.0009000301361084秒,进程id:8484

开始做任务啦,任务名称是: 听音乐

开始做任务啦,任务名称是: 唱歌

听音乐任务耗时2.0004489421844482秒,进程id:2056

听音乐任务耗时1.000549077987671秒,进程id:4816

开始做任务啦,任务名称是: 写作

唱歌任务耗时1.0005836486816406秒,进程id:8484

开始做任务啦,任务名称是: 做饭

开始做任务啦,任务名称是: 打游戏

做饭任务耗时1.000941514968872秒,进程id:8484

打游戏任务耗时1.0009276866912842秒,进程id:2056

写作任务耗时2.000699758529663秒,进程id:4816

OVER

图片示例如下:

标签: #python 进程池阻塞和非阻塞