python threading Condition 条件变量

mac2022-06-30  23

原因:在生产者跟消费者模式中,消费者判断有没有产品,这就形成一个判断。。。

import logging import threading import time from random import randint from threading import Condition logging.basicConfig( level=logging.INFO, format="%(asctime)s [*] %(message)s" ) L = [] threads = [] lock_con = Condition() class Producer(threading.Thread): def run (self): global L while True: # 创建随机数 val = randint(0, 100) if lock_con.acquire(): L.append(val) logging.info(f"{self.name}生产->{str(val)} 容器->{L}") lock_con.notifyAll() # 通知一个正在wait方法通过 lock_con.release() time.sleep(0.5) class Consumer(threading.Thread): def __init__ (self): super().__init__() self.name = "迷心兔" def run (self): global L while True: time.sleep(0.5) if len(L) == 0: # 等到收到通知或发生超时为止。 # 必须在已获得锁前提下才能调用,否则会触发RuntimeError lock_con.wait() if lock_con.acquire(): logging.info(f"{self.name}消费->{str(L[0])} 容器->{L}") del L[0] lock_con.release() if __name__ == '__main__': # 五个生产者----------------------------- for i in range(2): threads.append(Producer()) # 一个消费者----------------------------- threads.append(Consumer()) # 阻塞启动线程--------------------------- for t in threads: t.start() for t in threads: t.join()

输出:

2019-10-02 16:48:01,087 [*] Thread-1生产->80 容器->[80] 2019-10-02 16:48:01,088 [*] Thread-2生产->40 容器->[80, 40] 2019-10-02 16:48:01,588 [*] Thread-1生产->61 容器->[80, 40, 61] 2019-10-02 16:48:01,589 [*] 迷心兔消费->80 容器->[80, 40, 61] 2019-10-02 16:48:01,589 [*] Thread-2生产->43 容器->[40, 61, 43] 2019-10-02 16:48:02,089 [*] Thread-1生产->50 容器->[40, 61, 43, 50] 2019-10-02 16:48:02,090 [*] Thread-2生产->72 容器->[40, 61, 43, 50, 72] 2019-10-02 16:48:02,091 [*] 迷心兔消费->40 容器->[40, 61, 43, 50, 72] 2019-10-02 16:48:02,591 [*] Thread-1生产->19 容器->[61, 43, 50, 72, 19] 2019-10-02 16:48:02,592 [*] Thread-2生产->45 容器->[61, 43, 50, 72, 19, 45] 2019-10-02 16:48:02,593 [*] 迷心兔消费->61 容器->[61, 43, 50, 72, 19, 45] 2019-10-02 16:48:03,092 [*] Thread-1生产->63 容器->[43, 50, 72, 19, 45, 63] 2019-10-02 16:48:03,093 [*] Thread-2生产->32 容器->[43, 50, 72, 19, 45, 63, 32] 2019-10-02 16:48:03,095 [*] 迷心兔消费->43 容器->[43, 50, 72, 19, 45, 63, 32] 2019-10-02 16:48:03,594 [*] Thread-1生产->50 容器->[50, 72, 19, 45, 63, 32, 50] 2019-10-02 16:48:03,595 [*] Thread-2生产->18 容器->[50, 72, 19, 45, 63, 32, 50, 18] 2019-10-02 16:48:03,597 [*] 迷心兔消费->50 容器->[50, 72, 19, 45, 63, 32, 50, 18] 2019-10-02 16:48:04,095 [*] Thread-1生产->70 容器->[72, 19, 45, 63, 32, 50, 18, 70] 2019-10-02 16:48:04,096 [*] Thread-2生产->44 容器->[72, 19, 45, 63, 32, 50, 18, 70, 44] 2019-10-02 16:48:04,098 [*] 迷心兔消费->72 容器->[72, 19, 45, 63, 32, 50, 18, 70, 44] 2019-10-02 16:48:04,597 [*] Thread-1生产->89 容器->[19, 45, 63, 32, 50, 18, 70, 44, 89] 2019-10-02 16:48:04,598 [*] Thread-2生产->32 容器->[19, 45, 63, 32, 50, 18, 70, 44, 89, 32] 2019-10-02 16:48:04,600 [*] 迷心兔消费->19 容器->[19, 45, 63, 32, 50, 18, 70, 44, 89, 32] 2019-10-02 16:48:05,098 [*] Thread-1生产->5 容器->[45, 63, 32, 50, 18, 70, 44, 89, 32, 5] 2019-10-02 16:48:05,099 [*] Thread-2生产->10 容器->[45, 63, 32, 50, 18, 70, 44, 89, 32, 5, 10] 2019-10-02 16:48:05,101 [*] 迷心兔消费->45 容器->[45, 63, 32, 50, 18, 70, 44, 89, 32, 5, 10] 2019-10-02 16:48:05,598 [*] Thread-1生产->13 容器->[63, 32, 50, 18, 70, 44, 89, 32, 5, 10, 13] 2019-10-02 16:48:05,599 [*] Thread-2生产->30 容器->[63, 32, 50, 18, 70, 44, 89, 32, 5, 10, 13, 30] 2019-10-02 16:48:05,602 [*] 迷心兔消费->63 容器->[63, 32, 50, 18, 70, 44, 89, 32, 5, 10, 13, 30] 2019-10-02 16:48:06,099 [*] Thread-1生产->19 容器->[32, 50, 18, 70, 44, 89, 32, 5, 10, 13, 30, 19]
最新回复(0)