标签:结束 rmi __name__ 技术分享 alt imp 作用 主循环 tar
from multiprocessing import Pool,Process import time def func(i): num = 0 for j in range(5): # print(i+j) num += i return num if __name__ == ‘__main__‘: pool = Pool(4)#设置池中可以有多少个子进程在运行,始终使用这几个进程去执行所有的任务 # start_time = time.time() # gg = [] # for i in range(200): # p = Process(target=func,args = (i,)) 不使用地址池执行的异步的操作 # p.start() # gg.append(p) # [a.join() for a in gg] # end_time = time.time() # print(end_time-start_time) s_time = time.time() a = pool.map(func,range(200))#map是异步执行的,并且自带close和join print(a)#map方法与内置的map函数行为基本一致,在它会使进程阻塞与此直到结果返回 e_time = time.time() print(e_time-s_time) # map_async(func, iterable[, chunksize[, callback]]) # 与map用法一致,但是它是非阻塞的。与apply_async的套路基本一样
# # p.apply_async的异步执行的方法,和p.apply用法一致,但是它是非阻塞的且支持结果返回后进行回调。 from multiprocessing import Pool,Process import time def func(i): num = 0 for j in range(5): num += i time.sleep(1) # return num print(num) if __name__ == ‘__main__‘: pool = Pool(5) for i in range(10): # pool.apply(func,args=(i,))#同步执行的任务机制,每次创建一个子进程,主进程都会等待子进程返回结果才,进行后面的操作 ret = pool.apply_async(func,args=(i,)) #主循环在运行的过程中等待apply_async的返回结果, # 主循环运行结束后,即使子进程还没有返回,整个程序就直接结束,即使apply_async的是不阻塞的,由于apply_async的返回结果是一个结果对象 #要通过使用ret.get() 才能获取到数据,但是.get()就具有阻塞的功能,一般是将获取到的值添加的一个新的列表中,等所有子进程都结束的时候 #在通过遍历该该列表通过.get()的方法将结果提取 # 解决主循环运行结束后,即使子进程还没有返回,整个程序就直接结束的问题是: pool.close() #锁定进程池,让一次只能执行池的大小的容量,即使有些子进程运行的速度较快, # 运行完之后也干等,不把位置让给其他的不是同一批次进来的子进程, pool.join()#作用是等待进程池的所有任务结束 # pool.close()#锁定pool ,使其不接受新的任务 # pool.terminate()#结束工作进程,不处理未处理的任务 # pool.join()#主进程阻塞等待子进程的退出,一般用在close和terminate之后 #回调函数 from multiprocessing import Pool,Process import os def func(i): print(os.getpid()) return i*i def gg(P): print(os.getpid())#证明回调函数是在主函数上运行的 print(P) if __name__ == ‘__main__‘: pool = Pool(4) pool.apply_async(func,args=(3,),callback=gg)#callback函数不能直接传参,只能通过接收前一个函数的返回值 print(os.getpid()) pool.close() pool.join()
标签:结束 rmi __name__ 技术分享 alt imp 作用 主循环 tar
原文地址:https://www.cnblogs.com/vivi0403/p/10039513.html