进程间通讯:实现基于多进程的文件拷贝
- 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()