zoukankan      html  css  js  c++  java
  • 交替打印

    有两个数组a和b, 有两个线程分别读取数组a和数组b,线程1循环打印数组a中的数字,线程2循环打印数组b中的数,要求交叉,要求第一个数组先输出。

    import threading
    #method1:协程
    def sol(strs):
        for s in strs:
            res = yield s
            print(res)
            print(s)
    it = sol(['a', 'b', 'c', 'd'])
    next(it)
    for num in [1, 2, 3, 4]:
        try:
            it.send(num)
        except StopIteration as e:
            pass
    #用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,
    # 必须捕获StopIteration错误,返回值包含在StopIteration的value中
    
    #method2:信号量
    def printNumber(nums):
        for num in nums:
                s1.acquire()
                print(num)
                s2.release()
    
    
    def printAlpha(strs):
        for s in strs:
            s2.acquire()
            print(s)
            s1.release()
    
    if __name__ == "__main__":
        s1 = threading.Semaphore(1)
        s2 = threading.Semaphore(0)
        threads = []
        threads.append(threading.Thread(target=printNumber, args=([5, 6, 7, 8], )))
        threads.append(threading.Thread(target=printAlpha, args=(['e', 'f', 'g', 'h'], )))
        for thr in threads:
            thr.start()
        for thr in threads:
            thr.join()
    
    #method3:条件变量
    def printNum2(nums):
        for num in nums:
            with con:
                global count
                if count % 2 != 0:
                    con.wait()
                count += 1
                print(num)
                con.notify()
    
    def printAlpha2(strs):
        for s in strs:
            with con:
                global count
                if count % 2 != 1:
                    con.wait()
                count += 1
                print(s)
                con.notify()
    
    if __name__ == "__main__":
        global count
        count = 0
        con = threading.Condition()
        threads = []
        threads.append(threading.Thread(target=printNum2, args=([9, 10, 11, 12], )))
        threads.append(threading.Thread(target=printAlpha2, args=(['i', 'j', 'k', 'l'], )))
        for t in threads:
            t.start()
        for tt in threads:
            tt.join()
  • 相关阅读:
    怎样让人的一生价值最大
    [LeetCode][Java] Minimum Depth of Binary Tree
    KVC和KVO
    js获取单独一个checkbox是否被选中
    It's not a Bug, It's a Feature! (poj 1482 最短路SPFA+隐式图+位运算)
    超声波测距温度补偿
    系统封装接口层 cmsis_os
    STM32F4XX高效驱动篇2 I2C
    Stm32f103 ADC 学习笔记
    Stm32f103 DAC 学习笔记
  • 原文地址:https://www.cnblogs.com/liushoudong/p/13606482.html
Copyright © 2011-2022 走看看