python小试牛刀:多线程通过condition来同步

44 篇文章 0 订阅
24 篇文章 1 订阅

背景

并发线程是为了效率,多个无关联子任务并发执行,加速明显。但是很多任务的开启是有逻辑依赖关系。比如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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值