python 进程间通信和进程池之间通信

“”"
进程间的通信 Queue
多进程之间,默认是不共享数据的通过队列将queue对象当成参数传入进程创建,可以实现进程间的数据传递
初始化Queue() 对象时,q = Queue() 若括号中没有指定最大消息数量,或数量为负 表示没有上限
Queue.qsize() 返回当前队列包含的消息数量
Queue.empty() 如果队列为空 返回True 反之False
Queue.full() 队列满了 返回True 反之False
Queue.get([block,[,timeout]]) block 默认值是True 获取队列中的一条消息,然后将其移出
若block使用默认值,且没有设置timeout(秒),状态为阻塞直到从队列里读到数据,
多个子进程之间执行顺序由cpu调度,不一定按顺序执行
注意文件名不要命名为queue.py
“”"

from multiprocessing import *
def run1(q):
q.put(“xiao”)
def run2(q):
print(q.qsize())
print(q.get())
if name == “main”:
#全局共享 多个进程共享
q = Queue(3)#初始化一个Queue对象,最多接受三条消息
p = Process(target=run1,args = (q,))
p1 = Process(target=run2,args=(q,))
p.start()
p1.start()
p.join()
p1.join()
print(q.full())

#进程池之间通过队列的通信 使用multiprocessing.Manager().Queue()生成队列的对象
from multiprocessing import Manager,Pool
import time
def run1(q):
for i in “range”:
print(i)
q.put(i)
def run2(q):
time.sleep(1)
for i in range(q.qsize()):
print(“1%s”%(q.get()))
if name == “main”:
q = Manager().Queue()
po = Pool(10)
po.apply_async(run1,args=(q,))
po.apply_async(run2,args=(q,))
po.close()
po.join()

from multiprocessing import Queue,Process
import time
def write(q):
for value in [“a”,“b”,“c”]:
print(“开始写入:”,value)
q.put(value)
time.sleep(1)

def read(q):
while True:
if not q.empty():
print(“读取到的是”,q.get())
time.sleep(1)
else:
break
if name == “main”:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
pw.start()
pw.join()#等待接收完毕
pr.start()
pr.join()
print(“接收完毕!”)

你可能感兴趣的:(python 进程间通信和进程池之间通信)