深入学习深入学习python中的并发中的并发(一)---线程一)---线程
python也提供了线程相关的并发原语,如锁threading.Lock,事件threading.Event,条件变量threading.Condition,信号量
threading.Semaphore.
其实这些Python对象本质上都是对pthread_mutex_t, pthread_condition_t的封装。
而多线程编程同步控制的本质和原理都是一样的。
因此虽然学习的是Python中如何进行多线程编程,其实本质上是语言无关的。
talk is cheap.
我们先通过2个具体的例子来分析和理解python中的多线程编程。
1.实现实现2个线程交替打印奇偶数个线程交替打印奇偶数
2.实现一个支持并发使用的环形队列实现一个支持并发使用的环形队列
代码代码1::2个线程交替打印个线程交替打印:
import threading
import time
c1 = threading.Condition() #用2个条件变量控制交替执行
c2 = threading.Condition()
def prt(i, wait, notify, name):
while True:
with wait:
wait.wait()
print(i, name)
i += 2
time.sleep(1)
with notify:
notify.notify_all()
t1 = threading.Thread(target=prt, args=(0, c1, c2, "thread1", )) #等待通知交替传递
t2 = threading.Thread(target=prt, args=(1, c2, c1, "thread2", ))
t1.start()
t2.start()
with c1: #选择一个线程先运行
c1.notify_all()
t1.join()
t2.join()
代码代码2:一个支持并发的环形队列实现:一个支持并发的环形队列实现
import threading
class RingQueue:
def __init__(self, maxsize):
self._maxsize = maxsize
self._tail = 0
self._head = 0
self._len = 0
self._queue = [None for _ in range(maxsize)] self._mutex = threading.Lock() #控制并发访问的线程锁
self.not_full = threading.Condition(self._mutex) #等待队列有空闲位置
self.not_empty = threading.Condition(self._mutex) #等待队列有数据
def put(self, item):
with self.not_full:
while self._len == self._maxsize: