Python------使用Queue实现进程间通信
- Queue的使用
Queue本身就是一个消息队列程序
事例程序
#!/usr/bin/env python
# coding=utf-8
import multiprocessing
# 初始化对象时,若括号内没有指定最大可接收的消息数量,默认最大值(内存的尽头)
q = multiprocessing.Queue(3)
q.put(1)
q.put([11,22,33])
print(q.full()) # false
q.put("sjsjsjs")
print(q.full()) # True
#因为消息队列已满,try都会抛出异常,第一个try会等待2s再抛出异常,
#第二个try会立刻抛出异常
try:
q.put("ssss", True, 2)
except:
print("消息队列已满,现有消息的数量:%s" % q.qsize())
try:
q.put_nowait("aaa")
except:
print("消息队列已满,现有的消息数量为:%s" % q.qsize())
#先判断消息队列是否已满,再写入
if not q.full():
q.put_nowait("ssss")
#读取信息时, 先判断消息队列是否为空,再读取
if not q.empty():
for i in range(q.qsize()):
print(q.get_nowait())
2. 父进程中创建两个子进程,一个往Queue写数据,一个从Queue读数据:
#!/usr/bin/env python
# coding=utf-8
import multiprocessing
def download_from_web(q):
"""下载数据"""
#模拟从网上下载的数据
data = [11, 22, 33, 44]
#向队列中写数据
for temp in data:
q.put(temp)
print("---下载器已经下载完了数据并其存入到队列中----")
def analysis_data(q):
"""数据处理"""
waitting_analysis_data = list()
#从队列中获取数据
while True:
data = q.get()
waitting_analysis_data.append(data)
if q.empty():
break
#模拟数据处理
print(waitting_analysis_data)
def main():
#1 .创建一个队列
q = multiprocessing.Queue()
#2. 创建多个进程,将队列的引用当做实参进行传递到里面
p1 = multiprocessing.Process(target=download_from_web, args=(q,))
p2 = multiprocessing.Process(target=analysis_data, args=(q,))
p1.start()
p2.start()
if __name__ == "__main__":
main()