Python实现多线程很简单,直接继承threading.Thread
类,覆盖掉run()
方法即可。必要时还可以覆盖__init__()
方法以便于传递参数,不过要保证在新的__init__()
中首先调用threading.Thread
的__init__()
来完成一些必要的线程初始化工作。下面是一个简单的多线程版HelloWorld:
import threading
class MyThread(threading.Thread):
def __init__(self, para1, para2):
threading.Thread.__init__(self)
self.para1 = para1
self.para2 = para2
def run(self):
print self.para1
print self.para2
thread1 = MyThread('Hello, earthman.', 'Goodbye.')
thread2 = MyThread('Hello, ET.', 'Bye.')
thread1.start()
thread2.start()
“生产者-消费者”模型是很常见的多线程场景,程序维护一个数据缓冲区,一个“生产者”线程往里面放数据,另一个“消费者”线程从中取数据。这在Python中实现起来非常容易,因为Python有个线程安全、又非常高效的双端队列结构deque
,左右两端都能插入和取出数据,可以随心所欲地实现FIFO、LIFO甚至更复杂的结构,若指定maxlen
参数,还能自动变成循环缓冲区。这一切都不用操心加锁的问题。
在许多场景中,生产者和消费者自系统启动便始终谈笑风生。然而天下没有不散的筵席,系统总有终结的一刻,所以此处再考虑一个棒打鸳鸯的角色,叫做“终结者”,负责监控系统状态,在必要时通知大家撤退。整个系统包含一个生产者、若干个消费者和一个终结者,关系如下