from threading import Thread,Lock,Condition
task_lock = Lock()
def task(name: str):
global task_lock
for n in range(2):
task_lock.acquire()
print(f"{name}-round-{n}--step1\n",end='')
print(f"{name}-round-{n}--step2\n",end='')
print(f"{name}-round-{n}--step3\n",end='')
task_lock.release()
t1 = Thread(target=task,args=("A",))
t2 = Thread(target=task,args=("B",))
t3 = Thread(target=task,args=("C",))
t1.start()
t2.start()
t3.start()
class SafeQueue:
def __init__(self,size: int):
self.size = size
self.queue = list()
self.__queue_lock = Condition()
def put(self,item):
self.__queue_lock.acquire()
while len(self.queue) >= self.size:
self.__queue_lock.wait()
self.queue.insert(0,item)
self.__queue_lock.notify_all()
self.__queue_lock.release()
def get(self):
self.__queue_lock.acquire()
while len(self.queue) == 0:
self.__queue_lock.wait()
result = self.queue.pop()
self.__queue_lock.notify_all()
self.__queue_lock.release()
return result
class MsgProducer(Thread):
def __init__(self,name: str,count: int,queue: SafeQueue):
super().__init__()
self.setName(name)
self.count = count
self.queue = queue
def run(self) -> None:
for n in range(self.count):
msg = f"{self.getName()}--{n}"
self.queue.put(msg)
class MsgConsumer(Thread):
def __init__(self,name: str,queue: SafeQueue):
super().__init__()
self.setName(name)
self.queue = queue
self.daemon = True
def run(self) -> None:
while True:
msg = self.queue.get()
print(f"{self.getName()}--{msg}\n",end="")
queue = SafeQueue(3)
threads = list()
threads.append(MsgProducer("PA",10,queue))
threads.append(MsgProducer("PB",10,queue))
threads.append(MsgProducer("PC",10,queue))
threads.append(MsgConsumer("CA",queue))
threads.append(MsgConsumer("CB",queue))
for t in threads:
t.start()
python 线程锁 Lock 和 Condition
最新推荐文章于 2024-07-12 16:16:27 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)