博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 进程间的通信
阅读量:7002 次
发布时间:2019-06-27

本文共 2533 字,大约阅读时间需要 8 分钟。

#-*-coding:utf-8-*-'''python提供了多种进程间的通信方式,如:Queue,Pipe,Valie+Array等。    Queue与Pipe的区别在于Pipe常用来在两个进程间通信,Queue用来在多个进程间通信    Queue:        Put:用于插入数据到队列中(blocked,timeoutl两个可选参数,如果blocked为True(默认值)                        并且timeout为正值,该方法会阻塞timeout指定时间,指导队列有剩余空间,如果超时,会抛出Queue.Full异常,                        如果blocked为False,但Queue已满,会立即抛出Queue.Full异常)        Get:从队列读取并删除一个元素(blcoked,timeout两个可选参数,如果blocked为True(默认值)并且timeout为正值        name在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,则分为两种情况:                        如果Queue有一个值可用,则立即返回该值;否则如果队列为空,则立即抛出Queue.Empty异常)'''#例子:在父进程中创建三个子进程,两个资金长王Queue中写入数据一个进程从Queue中读取数据# from multiprocessing import Process,Queue# import os,time,random## #写数据进程执行的代码:# def proc_write(q,urls):#     print('Process(%s) is writing...'%os.getcwd())#     for url in urls:#         q.put(url)#         print('Put %s to queue...'%url)#         time.sleep(random.random())# #读数据进程执行的代码:# def proc_read(q):#     print('Process(%s) is reading...'%os.getpid())#     while True:#         url=q.get(True)#         print('get %s from queue.'%url)# if __name__=="__main__":#     #父进程创建Queue,并传递给各个子进程#     q=Queue()#     proc_write1=Process(target=proc_write,args=(q,['url_1','url_2','url_3']))#     proc_write2=Process(target=proc_write,args=(q,['url_4','url_5','url_6']))#     proc_reader=Process(target=proc_read,args=(q,))#     #启动子进程proc_writer写入#     proc_write1.start()#     proc_write2.start()#     #启动子进程proc_reader读取#     proc_reader.start()#     #等待proc_writer结束:#     proc_write1.join()#     proc_write2.join()#     #proc_reader进程里是死循环无法等待其结束,只能强行终止#     from multiprocessing import Pipe'''Pipe常用在两个进程间进行通信,两个进程分别位于进程两端,Pipe方法返回(conn1,conn2)代表一个管道的两端。Pipe方法有duplex参数,如果duplex为True(默认值)name这个管道是全双工模式,也就是说conn1和conn2均可以收发,如果duplex为False,conn1只负责接收消息,conn2只负责发送消息。send和recv方法分别是发送和接收消息的方法'''    #创建两个进程,一个进程通过Pipe发送数据一个进程通过Pipe接收数据import multiprocessingimport randomimport time,osdef proc_send(pipe,urls):    for url in urls:        print("Process(%s) send: %s" %(os.getpid(),url))        pipe.send(url)        time.sleep(random.random())def proc_recv(pipe):    while True:        print("Process(%s) rev:%s"%(os.getpid,pipe.recv()))        time.sleep(random.random())if __name__=="__main__":    pipe=multiprocessing.Pipe()    p1=multiprocessing.Process(target=proc_send,args=(pipe[0],['url_'+str(i) for i in range(10)]))    p2=multiprocessing.Process(target=proc_recv,args=(pipe[1],))    p1.start()    p2.start()    p1.join()    p2.join()

 

    
    摘自《Python爬虫开发与项目实战》

转载于:https://www.cnblogs.com/bin-l/p/8532655.html

你可能感兴趣的文章
resources.resx相关
查看>>
oracle中如何用提示符显示用户状态?
查看>>
CentOS转的服务器磁盘规划
查看>>
Oracle基础知识之物理存储结构
查看>>
我的友情链接
查看>>
哈佛结构与冯?诺伊曼结构区别
查看>>
耶鲁大学心态 ,送给正在奋斗的人 !
查看>>
磁盘空间耗尽(deleted)
查看>>
ansible任务的异步执行
查看>>
模拟计算器
查看>>
yum本地及网络仓库创建
查看>>
命令行编辑
查看>>
CentOS挂载ntfs文件系统
查看>>
aix下的mpio、rdac、sddpcm多路径软件操作
查看>>
fedora备份winxp fat32格式中文文件
查看>>
css link和@import区别用法
查看>>
HA+LB+NAS:三层架构实现群集高可用和高性能
查看>>
硬盘分区扩容
查看>>
Predicting purchase behavior from social media-www2013
查看>>
SAN,NAS,DAS及iSCSI其架构之间区别
查看>>