Python 进程间的通信
2018-03-09 10:51
633 查看
#-*-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 multiprocessing import random import time,os def 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爬虫开发与项目实战》
相关文章推荐
- Python 进程线程之间通信方式(1,基于队列的)
- 通过Python脚本理解系统进程间通信 推荐
- Python实现进程同步和通信
- python并发编程之多进程1-----------互斥锁与进程间的通信
- Python 进程线程之间通信方式(2,共享数据实现进程之间通信)
- python 多进程实例 进程间的通信
- Python实现进程同步和通信的方法
- Python 进程通信,队列(multiprocessing.Queue()),单向通信
- Python 进程线程之间通信方式(2.1,共享数据实现进程之间通信)
- python 多进程使用Queue通信的例子
- 通过Python脚本理解系统进程间通信
- python队列、线程间通信Queue,多进程模块multiprocessing
- python-进程之间通信、多线程介绍
- Python进程通信之匿名管道实例讲解
- Python中采用命名管道来做多进程通信
- python中进程通信之signal信号
- 11.python并发入门(part10 多进程之间实现通信,以及进程之间的数据共享)
- python 进程通信测试代码(程序A,程序B)
- Python搭建API,并通过Thrift 和C++进程通信,遇到了一个大BUG!
- python进程的通信:queue、进程池中的Queue