背景
并发线程是为了效率,多个无关联子任务并发执行,加速明显。但是很多任务的开启是有逻辑依赖关系。比如A线程搬移完数据,BCD线程才能进一步处理数据。
code
from threading import Thread
import threading
import time
#创建一个period线程,周期性启动threading.condition() .wati()设置来设置一波时序;
# 通过时序控制两个线程数数;
class periodTick:
def __init__(self,interval):
self._interval = interval
self._cond = threading.Condition()
self._flag = 0
#一个通知机制
def run(self):
while True:
time.sleep(self._interval)
with self._cond:
self._flag ^= 1
self._cond.notify_all()
def start(self):
t = Thread(target=self.run, daemon=True)
t.start()
print("Start!****")
#一个等待机制
def wait_tick(self):
with self._cond:
last_flag = self._flag
while last_flag == self._flag:
self._cond.wait()
pt = periodTick(2)
pt.start()
def countNum(n, name): #n轮,没轮数10个数;
while n > 0 :
pt.wait_tick()
#print("Thread %s counting >>>>>"%name)
for i in range(10):
#print("%d "%i)
print("Thread %s counting %d >>>>>" % (name, i) )
n -= 1
print("*****Thread %s printover %d round!*******\n"%(name,n))
# thread 1
t1 = Thread(target=countNum, args=(5, "Happy "))
t2 = Thread(target=countNum, args=(3, "Sad"))
t1.start()
t2.start()
print("over")
results
Start!****
over
Thread Sad counting 0 >>>>>
Thread Sad counting 1 >>>>>
Thread Sad counting 2 >>>>>
Thread Sad counting 3 >>>>>
Thread Sad counting 4 >>>>>
Thread Sad counting 5 >>>>>Thread Happy counting 0 >>>>>
Thread Happy counting 1 >>>>>
Thread Sad counting 6 >>>>>Thread Happy counting 2 >>>>>
Thread Happy counting 3 >>>>>
Thread Sad counting 7 >>>>>
Thread Happy counting 4 >>>>>
Thread Sad counting 8 >>>>>
Thread Sad counting 9 >>>>>Thread Happy counting 5 >>>>>
Thread Happy counting 6 >>>>>
Thread Sad printover 2 round!**
Thread Happy counting 7 >>>>>
Thread Happy counting 8 >>>>>
Thread Happy counting 9 >>>>>
Thread Happy printover 4 round!**
Thread Sad counting 0 >>>>>
Thread Sad counting 1 >>>>>
Thread Sad counting 2 >>>>>
Thread Sad counting 3 >>>>>
Thread Sad counting 4 >>>>>
Thread Sad counting 5 >>>>>
Thread Sad counting 6 >>>>>
Thread Sad counting 7 >>>>>
Thread Happy counting 0 >>>>>
Thread Happy counting 1 >>>>>
Thread Happy counting 2 >>>>>
Thread Happy counting 3 >>>>>
Thread Happy counting 4 >>>>>
Thread Happy counting 5 >>>>>
Thread Happy counting 6 >>>>>
Thread Happy counting 7 >>>>>
Thread Happy counting 8 >>>>>Thread Sad counting 8 >>>>>
Thread Sad counting 9 >>>>>
Thread Happy counting 9 >>>>>
Thread Happy printover 3 round!**
Thread Sad printover 1 round!**
Thread Sad counting 0 >>>>>
Thread Sad counting 1 >>>>>
Thread Sad counting 2 >>>>>
Thread Happy counting 0 >>>>>
Thread Happy counting 1 >>>>>
Thread Happy counting 2 >>>>>
Thread Happy counting 3 >>>>>
Thread Happy counting 4 >>>>>
Thread Happy counting 5 >>>>>
Thread Happy counting 6 >>>>>
Thread Happy counting 7 >>>>>
Thread Happy counting 8 >>>>>
Thread Sad counting 3 >>>>>
Thread Sad counting 4 >>>>>
Thread Sad counting 5 >>>>>
Thread Sad counting 6 >>>>>
Thread Sad counting 7 >>>>>
Thread Sad counting 8 >>>>>
Thread Sad counting 9 >>>>>
Thread Sad printover 0 round!**
Thread Happy counting 9 >>>>>
Thread Happy printover 2 round!**
Thread Happy counting 0 >>>>>
Thread Happy counting 1 >>>>>
Thread Happy counting 2 >>>>>
Thread Happy counting 3 >>>>>
Thread Happy counting 4 >>>>>
Thread Happy counting 5 >>>>>
Thread Happy counting 6 >>>>>
Thread Happy counting 7 >>>>>
Thread Happy counting 8 >>>>>
Thread Happy counting 9 >>>>>
Thread Happy printover 1 round!**
Thread Happy counting 0 >>>>>
Thread Happy counting 1 >>>>>
Thread Happy counting 2 >>>>>
Thread Happy counting 3 >>>>>
Thread Happy counting 4 >>>>>
Thread Happy counting 5 >>>>>
Thread Happy counting 6 >>>>>
Thread Happy counting 7 >>>>>
Thread Happy counting 8 >>>>>
Thread Happy counting 9 >>>>>
Thread Happy printover 0 round!**
Process finished with exit code 0
解释
线程名称 | 功能 | 方法 | 依赖 |
---|---|---|---|
periodTick | 守护线程 | threading.condition设置wait方法阻塞; notify_all放开阻塞;flag控制没隔interval时间设置/解除阻塞 | 无 |
t1 | 任务线程 | 数数1-10,进行n轮 | periodTick |
t2 | 任务线程 | 数数1-10,进行n轮 | periodTick |