IPA 通信
概念原理
创建/方法
Queue([maxsize])
创建共享的进程队列。
maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。
Queue的实例q具有以下方法:
q.get( [ block [ ,timeout ] ] )
返回q中的一个项目。
q为空,此方法将阻塞,直到队列中有项目可用为止。
block 用于控制阻塞行为,
默认为True.
设置为False,将引发Queue.Empty异常(定义在Queue模块中)。
timeout 可选超时时间
用在阻塞模式中
如果在制定的时间间隔内没有项目变为可用,将引发Queue.Empty异常。
q.get_nowait( )
同q.get(False)方法。
q.put(item [, block [,timeout ] ] )
将item放入队列 , 如果队列已满,此方法将阻塞至有空间可用为止。
block控制阻塞行为,
默认为True。
设置为False,将引发Queue.Empty异常(定义在Queue库模块中)。
timeout指定在阻塞模式中等待可用空间的时间长短
超时后将引发Queue.Full异常。
q.qsize()
返回队列中目前项目的正确数量。
此函数的结果并不可靠,因为在返回结果和在稍后程序中使用结果之间,队列中可能添加或删除了项目
在某些系统上,此方法可能引发NotImplementedError异常。
q.empty()
如果调用此方法时 q为空,返回True。
如果其他进程或线程正在往队列中添加项目,结果是不可靠的。也就是说,在返回和使用结果之间,队列中可能已经加入新的项目。
q.full()
如果q已满,返回为True. 由于线程的存在,结果也可能是不可靠的(参考q.empty()方法)。。
进程间通讯示例
import time from multiprocessing import Process, Queue def f(q): q.put([time.asctime(), 'hi', 'hello']) #调用主函数中p进程传递过来的进程参数 put函数为向队列中添加一条数据。 if __name__ == '__main__': q = Queue() #创建一个Queue对象 p = Process(target=f, args=(q,)) #创建一个进程 p.start() print(q.get()) # ['Wed Jan 30 23:54:47 2019', 'hi', 'hello'] # 子进程拿到了父进程的数据 p.join()
生产者消费者模型
无信号纯阻塞的模型
from multiprocessing import Process,Queue import time,random,os def consumer(q): while True: res=q.get() time.sleep(random.randint(1,3)) print('