进程池中的Queue
如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则会得到一条如下的错误信息:
RuntimeError: Queue objects should only be shared between processes through inheritance.
下面的实例演示了进程池中的进程如何通信:
import multiprocessing import time def write_queue(queue): # 循环写入数据 for i in range(10): if queue.full(): print("队列已满!") break # 向队列中放入消息 queue.put(i) time.sleep(0.5) def read_queue(queue): # 循环读取队列消息 while True: # 队列为空,停止读取 if queue.empty(): print("---队列已空---") break # 读取消息并输出 result = queue.get() print(result) if __name__ == '__main__': # 创建消息队列 queue = multiprocessing.Queue(3) # 创建子进程 p1 = multiprocessing.Process(target=write_queue, args=(queue,)) p1.start() # 等待p1写数据进程执行结束后,再往下执行 p1.join() p1 = multiprocessing.Process(target=read_queue, args=(queue,)) p1.start()q.put():存数据 q.get():取数据 q.full():判断数据是否是满的 q.empty()判断数据是否为空 q.get_nowait():立即存数据不等待 q.put_nowait():立即取数据不等待
进程间通信的方式:命名管道 无名管道 共享内存 队列 网络功能
fork ()是最底层的方法。
pool = Pool(3)
pool.apply_async(xx)
pool 中,主进程一般不干活,主要是创建的子进程干活,join()方法用来等待。
apply()=>堵塞式
进程共享数据,写实拷贝。
主进程的pid 是运行程序的那个软件的pid值
案例:文件夹copy器
import multiprocessing import os # file_name 文件名 # source_dir 源文件目录 # dest_dir 目标文件目录 def copy_work(file_name, source_dir, dest_dir): # 拼接路径 source_path = source_dir+"http://www.likecs.com/"+file_name dest_path = dest_dir+"http://www.likecs.com/"+file_name print(source_path, "----->", dest_path) # 打开源文件、创建目标文件 with open(source_path,"rb") as source_file: with open(dest_path,"wb") as dest_file: while True: # 循环读取数据 file_data = source_file.read(1024) if file_data: # 循环写入到目标文件 dest_file.write(file_data) else: break if __name__ == '__main__': # 1、定义源文件目录和目标文件夹的目录 source_dir = "test" dest_dir = "/home/teahcer/桌面/test" try: # 2、创建目标文件夹目录 os.mkdir(dest_dir) except: print("目标文件夹已经存在,未创建~") # 3、列表得到所有的源文件中的文件 file_list = os.listdir(source_dir) print(file_list) # 4、创建进程池 pool = multiprocessing.Pool(3) # 5、for 循环,依次拷贝每个文件 for file_name in file_list: # copy_work(file_name, source_dir, dest_dir) pool.apply_async(copy_work, args=(file_name, source_dir, dest_dir)) # 6、关闭进程池 pool.close() # 7、设置主进程等待子进程执行结束再退出 pool.join()============================================================================
协程:
迭代器(iterator):
迭代是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会后退。
可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,这样的过程称为遍历,也叫迭代。
可迭代对象(Iterable):可以通过for...in...这类语句迭代读取一条数据供我们使用的对象。列表元组字典都是 可迭代对象。
可迭代对象通过__iter__方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.
一个具备了__iter__方法的对象,就是一个可迭代对象。
一个实现了__iter__方法和__next__方法的对象,就是迭代器。