进程间通讯:实现基于多进程的文件拷贝

  • apply_async非阻塞式调度,apply阻塞式调度
  • 任何进程间资源都是独立的,所有一切都是不可以共享的。实现资源共享、进程间通讯比较常用的方式就是Queue。

  • 使用Queue可以解决Process创建的进程之间的通讯,但是无法解决进程池中进程之间通讯。

  • 进程池进程之间的通讯需要使用Manager.Queue()创建的队列。

# coding:utf-8

from multiprocessing import Pool,Manager
import os

def copyfile(op,np,fn,queue):
    fileread = open(op+'/'+fn)
    filewrite = open(np+'/'+fn,'w')
    # 当然如果是较大文件时循环读取
    content = fileread.read()
    filewrite.write(content)
    fileread.close()
    filewrite.close()
    queue.put(fn)

def main():
    op = input('please input folder path:')
    np = op+'-backups'
    os.makedirs(np)
    fns = os.listdir(op)

    pool = Pool(5)
    queue = Manager().Queue()

    for name in fns:
        pool.apply_async(copyfile,args=(op,np,name,queue))

    num = 0
    allNum = len(fns)
    while num<allNum:
        queue.get()
        num += 1
        copyRate = num/allNum
        print('\r当前copy进度:%.2f%%'%(copyRate*100),end='')

    print('\n 已完成copy!')

if __name__ == '__main__':
    main()

 

posted @ 2018-12-01 11:06  yudis  阅读(174)  评论(0编辑  收藏  举报