Changchun Master Li

Python异步队列实现生产者消费者模式

2015-07-04

background

进程间通信方式又称IPC,可以分为控制信息的通信(如semophore、signal)和数据信息的通信(如pipe、message queue、shared memory、socket)。IPC通常由操作系统完成。

同一进程的线程共享全局变量和内存,所以线程间通信简单。操作系统的最小调度单位是线程,线程的花费也小得多。但线程为了保护共享变量,需要做好同步/互斥。线程间的同步方式有临界区、互斥锁、信号量。

由Python有GIL的存在,多线程只适用于IO密集型程序。
Python有很多异步的library,如multiprocessing、threading、gevent。

使用threading,with和threading.Condition()可以很容易的实现临界区。

1
2
with condition:
...

Queue

Python提供了三种异步队列:Queue、LifoQueue、PriorityQueue。他们都是线程安全的。maxsize参数提供大小限制,PriorityQueue是优先队列,通常的入队对象格式是(priority_number, data)。

两个异常Queue.Empty和Queue.Full,会在get_nowait和put_nowait抛出。

Queue对象的方法使用也十分简单。qsize、empty、full返回队列的状态。提供同步和异步的get、put。task_done和join可以控制线程退出。

生产者消费者模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import Queue
from threading import Thread

class demo():
def __init__(self):
self._q = Queue()

def consumer(self):
while True:
data = self._q.get()
...

def producer(self):
while True:
self._q.put(data)
...

def run(self):
t1 = Thread(target=consumer, name='consumer')
t2 = Thread(target=producer, name='producer')
t1.start()
t2.start()
Tags: Python
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章