Python高级编程之消息队列(Queue)与进程池(Pool)实例详解

上传人:公**** 文档编号:512761812 上传时间:2024-02-02 格式:DOC 页数:4 大小:95KB
返回 下载 相关 举报
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解_第1页
第1页 / 共4页
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解_第2页
第2页 / 共4页
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解_第3页
第3页 / 共4页
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《Python高级编程之消息队列(Queue)与进程池(Pool)实例详解》由会员分享,可在线阅读,更多相关《Python高级编程之消息队列(Queue)与进程池(Pool)实例详解(4页珍藏版)》请在金锄头文库上搜索。

1、Python高级编程之消息队列(Queue与进程池(Pool实例详解本文实例讲述了Python高级编程之消息队列Queue)进程池Poo。分享给大家供大家参考,具体如下:Queue消息队列1创.建otmultiprocessingqueue=ultoe队列长度Queue方法方法描述put变量名数据,放入数据如队列已满,则程序进入阻塞状态,等待队列取出后再放入)put_now变量名utno数据:,放入数据如队列已满,则不等待队列信息取出后再放Utno入,直接报错et变量名数据,取出数据如队列为空,则程序进入阻塞状态,等待队列防如数get据后再取出)变量名etno数据,t取出数据如队列为空,则不等

2、待队列放入信息后取出数etno据,t直接报错,放入数据后立马判断是否为空有时为ue原因是放入值和判断同时进行e变量名,消息、数量ety变量名et返回值为或l,e判断是否为空ull变量名u返回值为或l,e判断是否为满3进.程通信因为进程间不共享全局变量,所以使用Queue进行数据通信,可以在父进程中创建两个字进程,一个往Queue里写数据,一个从Queue里取出数据。例:otultoenotteeteueueueue循环写入数据onneueueull队列已满nte向队列中放入消息queue.put(i)ntteleeeeueueueue向循列环向读取队列消息hleue队列为空,停止读取ifque

3、ue.empty():队列已空-e向向读向取消列息向并输出eultqueue.get()print(result)f_name_n_:创列建消息队列queue=multiprocessin.Queue创建子进程p1=multiprocessing.Proces等待写数据进程执行结束后,再往下执行p1.join()et=write_queueueueultoenPoeet=read_queueueue执行结果:口Poo进程池初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么

4、该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。1.创建importmultiprocessingpool=multiprocessing.Pool(最大进程数)2方法方法描述apply()apply_async()close()terminate()以同步方式添加进程以异步方式添加进程关闭Pool,使其不接受新任务(还可以使用)不管任务是否完成,立即终止join()主进程阻塞,等待子进程的退出,必须在close和terminate后使用3.进程池内通信创建进程池内Queue消息队列通信importmultiprocessingQueue:queue=multiproces

5、sing.Manager().Queue()例:importmultiprocessingimporttime写入数据的方法defwrite_data(queue):# for循环向消息队列中写入值foriinrange(5):# 添加消息queue.put(i)print(i)time.sleep(0.2)print(队列已满)创建读取数据的方法defread_data(queue):# 循环读取数据whileTrue:# 判断队列是否为空ifqueue.qsize()=0:print(队列为空)break# 从队列中读取数据result=queue.get()print(result)if

6、_name_=_main_:# 创建进程池pool=multiprocessing.Pool(2)# 创建进程池队列queue=multiprocessing.Manager().Queue()# 在进程池中的进程间进行通信# 使用线程池同步的方式,先写后读# pool.apply(write_data,(queue,)# pool.apply(read_data,(queue,)# apply_async()返回ApplyResult对象result=pool.apply_async(write_data,(queue,)# ApplyResult对象的wait()方法,表示后续进程必须等待

7、当前进程执行完再继续result.wait()pool.apply_async(read_data,(queue,)pool.close()#异步后,主线程不再等待子进程执行结束,再结束# join()后,表示主线程会等待子进程执行结束后,再结束pool.join()运行结果:4案例(文件夹copy器)代码:#导入模块importosimportmultiprocessing#拷贝文件函数defcopy_dir(file_name,source_dir,desk_dir):# 要拷贝的文件路径source_path=source_dir+/+file_name#目标路径desk_path=de

8、sk_dir+/+file_name#获取文件大小file_size=os.path.getsize(source_path)# 记录拷贝次数i=0#以二进制度读方式打开原文件withopen(source_path,rb)assource_file:# 以二进制写入方式创建并打开目标文件withopen(desk_path,wb)asdesk_file:#循环写入whileTrue:# 读取1024字节file_data=source_file.read(1024)# 如果读到的不为空,则将读到的写入目标文件iffile_data:desk_file.write(file_data)#读取次

9、数+1i+=1#拷贝百分比进度等于拷贝次数*1024*100文件大小n=i*102400/file_sizeifn=100:n=100print(file_name,拷贝进度%.2f%n)else:print(file_name,拷贝成功)breakif_name_=_main_:# 要拷贝的文件夹source_dir=test# 要拷贝到的路径desk_dir=C:/Users/Administrator/Desktop/+source_dir# 存在文件夹则不创建try:os.mkdir(desk_dir)except:print(目标文件夹已存在,未创建)#获取文件夹内文件目录,存到列表

10、里file_list=os.listdir(source_dir)print(file_list)# 创建进程池,最多同时运行3个子进程pool=multiprocessing.Pool(3)forfile_nameinfile_list:# 异步方式添加到进程池内pool.apply_async(copy_dir,args=(file_name,source_dir,desk_dir)#关闭进程池(停止添加,已添加的还可运行)pool.close()# 让主进程阻塞,等待子进程结束pool.join()运行结果:口更多关于Python相关内容感兴趣的读者可查看本站专题:、及希望本文所述对大家Python程序设计有所帮助。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号