线程间的通信机制:
条件变量:线程根据条件值的情况来实现同步。
场景:如果要实现一遍一遍地重复通知某个事件,最好选择Condition对象来处理,例如周期性定时器:
import threading
import time
class Timer:
def __init__(self,interval):
self._interval = interval
self._flag = 0
self._cv = threading.Condition()# 创建Condition对象
def start(self):
t = threading.Thread(target=self.run,args=())
t.daemon = True
t.start()
def run(self):
while True:
time.sleep(self._interval)# 始终的打点频率(1/self._interval (次/秒))
with self._cv:
self._flag ^= 1#让标志位 1 0 1 0 地进行交替(按位异或)
self._cv.notify_all()
def wait_for_tick(self):
with self._cv:
last_flag = self._flag
while last_flag == self._flag:
self._cv.wait()
ptimer = Timer(5)# 每5秒打点一次
ptimer.start()
def countdown(n):
while n > 0:
n-=1
print('countDown:',n)
def countup(a):
num = 0
while num < a:
num += 1
print('countUp:',num)
threading.Thread(target=countdown,args=(10,)).start()
threading.Thread(target=countup,args=(5,)).start()
对于初学者来说这部分知识无疑难上加难,多线程高并发本身就是目前程序界的头等难题,在复杂的大型高并发系统中,线程运行顺序及状态等变得尤为重要且尤其的困难,原因很简单,这部分是由系统来控制的,并不是程序员几行代码就可以搞定的,及时可以按照顺序执行,在大型项目中,也不是一般程序员可以企及的。以上代码只是保证了同步的实现,但是,同步不代表顺序一定。