成都网站建设模版,网站建设总结报告书,广州网络营销系统,百度天眼查公司进程池Pool在利用Python进行系统管理的时候#xff0c;特别是同时操作多个文件目录#xff0c;或者远程控制多台主机#xff0c;并行操作可以节约大量的时间。当被操作对象数目不大时#xff0c;可以直接利用multiprocessing中的Process动态成生多个进程#xff0c;但如果…进程池Pool在利用Python进行系统管理的时候特别是同时操作多个文件目录或者远程控制多台主机并行操作可以节约大量的时间。当被操作对象数目不大时可以直接利用multiprocessing中的Process动态成生多个进程但如果是上百个上千个目标手动的去限制进程数量却又太过繁琐此时就可以用到multiprocessing模块提供的Pool方法。初始化Pool时可以指定一个最大进程数当有新的请求提交到pool中时如果池还没有满那么就会创建一个新的进程用来执行该请求但如果池中的进程数已经达到规定最大值那么该请求就会等待直到池中有进程结束才会创建新的进程来它。一使用进程池例1非阻塞from multiprocessing import Poolimport os, time, randomdef worker(name):t_start time.time()print(%s开始执行,进程号为%d % (name, os.getpid()))# random.random()随机生成0~1之间的浮点数time.sleep(random.random() * 2)t_stop time.time()print(name, 执行完毕耗时%0.2f % (t_stop - t_start))def main():po Pool(5) # 定义一个进程池最大进程数5# 往进程池中添加任务for i in range(10):# Pool.apply_async(要调用的目标,(传递给目标的参数元祖,))# 每次循环将会用空闲出来的子进程去调用目标po.apply_async(worker, (fliang{i},))print(----start----)po.close() # 关闭进程池关闭后po不再接收新的请求po.join() # 等待po中所有子进程执行完成必须放在close语句之后print(----all_done----)if __name__ __main__:main()执行结果----start----liang0开始执行,进程号为10404liang1开始执行,进程号为9920liang2开始执行,进程号为13136liang3开始执行,进程号为10180liang4开始执行,进程号为7708liang4 执行完毕耗时0.57liang5开始执行,进程号为7708liang2 执行完毕耗时1.20liang6开始执行,进程号为13136liang1 执行完毕耗时1.33liang7开始执行,进程号为9920liang0 执行完毕耗时1.34liang8开始执行,进程号为10404liang3 执行完毕耗时1.96liang9开始执行,进程号为10180liang5 执行完毕耗时1.73liang9 执行完毕耗时0.54liang8 执行完毕耗时1.28liang7 执行完毕耗时1.37liang6 执行完毕耗时1.88----all_done----函数解释apply_async(func[, args[, kwds]]) 使用非阻塞方式调用func(并行执行堵塞方式必须等待上一个进程退出才能执行下一个进程)args为传递给func的参数列表, kwds为传递给func的关键字参数列表apply(func[, args[, kwds]])使用阻塞方式调用funcclose()关闭Pool使其不再接受新的任务terminate()不管任务是否完成立即终止join()主进程阻塞等待子进程的退出 必须在close或terminate之后使用执行说明创建一个进程池pool并设定进程的数量为5range(10)会相继产生10个对象10个对象被提交到pool中因pool指定进程数为5所以0、1、2、3、4会直接送到进程中执行当其中一个执行完后才空出一个进程处理对象继续去执行新的对象所以会出现输出“liang5开始执行,进程号为7708”出现在liang4 执行完毕耗时0.57后。因为为非阻塞主函数会自己执行自个的不搭理进程的执行所以运行完for循环后直接输出“----start----”主程序在pool.join()处等待各个进程的结束。例2阻塞from multiprocessing import Poolimport os, time, randomdef worker(name):t_start time.time()print(%s开始执行,进程号为%d % (name, os.getpid()))# random.random()随机生成0~1之间的浮点数time.sleep(random.random() * 2)t_stop time.time()print(name, 执行完毕耗时%0.2f % (t_stop - t_start))def main():po Pool(3) # 定义一个进程池最大进程数3# 往进程池中添加任务for i in range(0, 5):# Pool.apply_async(要调用的目标,(传递给目标的参数元祖,))# 每次循环将会用空闲出来的子进程去调用目标po.apply(worker, (fliang{i},))print(----start----)po.close() # 关闭进程池关闭后po不再接收新的请求po.join() # 等待po中所有子进程执行完成必须放在close语句之后print(----all_done----)if __name__ __main__:main()输出liang0开始执行,进程号为1976liang0 执行完毕耗时1.75liang1开始执行,进程号为12624liang1 执行完毕耗时0.57liang2开始执行,进程号为12444liang2 执行完毕耗时0.52liang3开始执行,进程号为1976liang3 执行完毕耗时1.23liang4开始执行,进程号为12624liang4 执行完毕耗时0.85----start--------all_done----因为是阻塞主函数会等待进程的执行执行完之后才会继续往下所以运行完所有进程后才输出“----start----”例3、使用进程池并返回结果from multiprocessing import Poolimport os, time, randomdef worker(name):print(%s开始执行,进程号为%d % (name, os.getpid()))# random.random()随机生成0~1之间的浮点数time.sleep(random.random() * 2)return name,os.getpid()def main():po Pool(3) # 定义一个进程池最大进程数3res[]# 往进程池中添加任务for i in range(0, 5):# Pool.apply_async(要调用的目标,(传递给目标的参数元祖,))# 每次循环将会用空闲出来的子进程去调用目标res.append(po.apply_async(worker, (fliang{i},)))print(----start----)po.close() # 关闭进程池关闭后po不再接收新的请求po.join() # 等待po中所有子进程执行完成必须放在close语句之后for result in res:print(result.get()) #get()函数得出每个返回结果的值print(----all_done----)if __name__ __main__:main()输出结果----start----liang0开始执行,进程号为14012liang1开始执行,进程号为13000liang2开始执行,进程号为14120liang3开始执行,进程号为14012liang4开始执行,进程号为14012(liang0, 14012)(liang1, 13000)(liang2, 14120)(liang3, 14012)(liang4, 14012)----all_done----例4、多进程执行多个任务from multiprocessing import Poolimport os, time, randomdef worker1(name):print(%s开始执行work1,进程号为%d % (name, os.getpid()))# random.random()随机生成0~1之间的浮点数time.sleep(random.random() * 2)def worker2(name):print(%s开始执行work2,进程号为%d % (name, os.getpid()))# random.random()随机生成0~1之间的浮点数time.sleep(random.random() * 2)def worker3(name):print(%s开始执行work3,进程号为%d % (name, os.getpid()))# random.random()随机生成0~1之间的浮点数time.sleep(random.random() * 2)def main():po Pool(4) # 定义一个进程池最大进程数3work_list[worker1,worker2,worker3]# 往进程池中添加任务for work in work_list:for i in range(3):po.apply_async(work, (fliang{i},))print(----start----)po.close() # 关闭进程池关闭后po不再接收新的请求po.join() # 等待po中所有子进程执行完成必须放在close语句之后print(----all_done----)if __name__ __main__:main()线程池4个线程执行3个任务每个任务执行3次。输出----start----liang0开始执行work1,进程号为13088liang1开始执行work1,进程号为4908liang2开始执行work1,进程号为4200liang0开始执行work2,进程号为8124liang1开始执行work2,进程号为4908liang2开始执行work2,进程号为13088liang0开始执行work3,进程号为8124liang1开始执行work3,进程号为4200liang2开始执行work3,进程号为4908----all_done----二、进程池进程之间的通讯进程池中进程的通讯队列from multiprocessing import Pool, Managerq Manager().Queue()import osimport timefrom multiprocessing import Pool, Managerdef work(name, q):time.sleep(1)print(f{name}---{os.getpid()}---{q.get()})def main():# 创建一个用于进程池通信的队列q Manager().Queue()for i in range(1000):q.put(fdata-{i})# 创建一个拥有五个进程的进程池po Pool(5)# 往进程池中添加20个任务for i in range(20):po.apply_async(work, (fliang{i}, q))# close:关闭进程池(进程池停止接收任务)po.close()# 主进程等待进程池中的任务结束再往下执行po.join()if __name__ __main__:main()