并行程序进程(二)

进程间通信-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()

猜你喜欢

转载自blog.csdn.net/Albert_Ejiestein/article/details/84197152
今日推荐