python 3.x 学习笔记16 (队列queue 以及 multiprocessing模块)
1.队列(queue)
用法:
import queue q = queue.Queue() #先进先出模式 q.put(1) #存放数据在q里
作用: 1)解耦
2)提高效率
class queue.Queue(maxsize=0) #先入先出
class queue.LifoQueue(maxsize=0) #后进先出
class queue.PriorityQueue(maxsize=0) #存储数据时可设置优先级的队列
Queue.qsize() # 返回队列的大小
Queue.empty() # 如果队列为空,返回True,反之False
Queue.full() #如果队列满了,返回True,反之
Queue.get([block[, timeout]]) # 获取队列,timeout等待时间
Queue.get_nowait() #相当Queue.get(False)
Queue.put(item) #写入队列,timeout等待时间( 非阻塞)
Queue.put_nowait(item) # 相当Queue.put(item, False)
Queue.task_done() #在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
Queue.join() #实际上意味着等到队列为空,再执行别的操作
2.python多线程不适合cpu密集操作型的任务,适合io操作密集型的任务
3.multiprocessing模块
官方详解:https://docs.python.org/3.5/library/multiprocessing.html#module-multiprocessing
1).pipe(管道)
multiprocessing.Pipe()即管道模式,调用Pipe()返回管道的两端的Connection。
2).manager
multiprocessing.manager()
用于多进程之间信息的共享
3).Pool(进程池)
multiprocessing.Pool()
1)进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。
2)在windos上必须写上if __name__=='__main__':之后才生成进程池才不会出错进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
3)进程池两个方法
apply() 穿行
apply_async() 并行
注:pool.apply_async(func=Foo, args=(i,), callback=Bar)#callback回调Bar
6.if __name__=='__main__':
_name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。