进程间通信-Queue
多进程之间需要通信,操作系统提供了很多机制,有无名管道,命名管道,共享内存,消息队列,信号量,socket。Queue是其中的消息队列程序。
详细情况见该贴https://blog.csdn.net/wh_sjc/article/details/70283843
初始化Queue()时,如果没有指定最大可接收消息的数量,则意味着爱接收多少接收多少,没限制。
- Queue.qsize() 队列消息的多少
- Queue.empty()
- Queue.full()
- Queue.get() 获取队列
- Queue.put() 添加队列
Process-Queue
现在设计两个进程,一个用来写数据,一个用来取数据,但是进程之间是相互独立互不影响的,那应该怎样使得两个进程之间交换数据呢?通过Process元组把Queue作为参数进行传递。
from multiprocessing import Process,Queue
import time,random
def write(num):
"""写入数据"""
for value in ['A','B','C','D','E']:
print("put %s to queue"%value)
num.put(value)
def read(num):
"""读取数据"""
while True:
if not num.empty():
value = num.get()
print("get %s from queue"%value)
time.sleep(random.random())
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()
# put A to queue
# put B to queue
# put C to queue
# put D to queue
# put E to queue
# get A from queue
# get B from queue
# get C from queue
# get D from queue
# get E from queue
进程池-Manager
from multiprocessing import Pool,Manager
import time,random
def write(num):
"""写入数据"""
for value in ['A','B','C','D','E']:
print("put %s to queue"%value)
num.put(value)
def read(num):
"""读取数据"""
for i in range(num.qsize()):
value = num.get()
print("get %s from queue"%value)
time.sleep(random.random())
if __name__=="__main__":
pool = Pool()
q = Manager().Queue()
pool.apply(write,(q,))
pool.apply(read,(q,))
pool.close()
pool.join()
# put A to queue
# put B to queue
# put C to queue
# put D to queue
# put E to queue
# get A from queue
# get B from queue
# get C from queue
# get D from queue
# get E from queue
实例:利用多进程来复制文件
# coding=utf-8
from multiprocessing import Pool,Manager
import os
def copy_file_task(name,oldFolderName,newFolderName,queue):
fr = open(oldFolderName+"/"+name)
fw = open(newFolderName+"/"+name,"w")
# print("---test---")
content = fr.read()
fw.write(content)
fr.close()
fw.close()
queue.put(name)
def main():
# 获取要复制的文件的名字
oldFolderName = input("请输入要复制的文件夹:")
# 建立一个文件夹用来存放复制文件(复制的是文件而不是文件夹)
newFolderName = oldFolderName + "复件"
os.mkdir(newFolderName)
# 获取原文件夹的每一个文件
fileNames = os.listdir(oldFolderName)
# 使用多进程进行复制
pool = Pool(5)
queue = Manager().Queue()
for file in fileNames:
pool.apply_async(copy_file_task,args=(file,oldFolderName,newFolderName,queue))
num = 0
allnum = len(fileNames)
while True:
queue.get()
num += 1
copyRate = num/allnum
print("进度%.2f%%"%(copyRate*100),end="")
print("---test---")
if num==allnum:
break
# pool.close()
# pool.join()
if __name__=="__main__":
main()