python 多线程编程
使用回调方式
1 | import time |
使用继承方式
1 | from threading import Thread |
注意使用变量 self._running
退出线程的方式
使用 Queue 进行线程间通信
1 | import Queue |
setDaemon 设置为 True, run 函数中不需要退出,主线程结束后所有子线程退出
如果 setDaemon 设置为 False, 则改为
1 | def run(self): |
并且在主函数结束前 join 所有线程
注意
向队列中添加数据项时并不会复制此数据项,线程间通信实际上是在线程间传递对象引用。如果你担心对象的共享状态,那你最好只传递不可修改的数据结构(如:整型、字符串或者元组)或者一个对象的深拷贝。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18from queue import Queue
from threading import Thread
import copy
# A thread that produces data
def producer(out_q):
while True:
# Produce some data
...
out_q.put(copy.deepcopy(data))
# A thread that consumes data
def consumer(in_q):
while True:
# Get some data
data = in_q.get()
# Process the data
...q.qsize() , q.full() , q.empty() 等实用方法可以获取一个队列的当前大小和状态。但要注意,这些方法都不是线程安全的。可能你对一个队列使用 empty() 判断出这个队列为空,但同时另外一个线程可能已经向这个队列中插入一个数据项。
参考
Sync From: https://github.com/TheBigFish/blog/issues/5