📅  最后修改于: 2023-12-03 14:51:22.794000             🧑  作者: Mango
在多线程编程中,线程间通信是一项非常重要的技术。而共享队列是一种常见的线程间通信方式,它可以让多个线程并发地向队列中添加或者移除元素,从而达到数据的交换和共享的目的。
下面是一个 Python 代码示例,展示了如何在三个线程之间共享同一个队列。在该示例中,我们定义了三个线程:生产者线程、消费者线程1 和消费者线程2。生产者线程会往队列中添加元素,而两个消费者线程会同时从队列中读取元素,实现数据的共享和交换。
import queue
import threading
import time
class ProducerThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
for i in range(10):
item = "Product {}".format(i)
self.queue.put(item)
print("Producer thread: Added item {} to the queue".format(item))
time.sleep(1)
class ConsumerThread1(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
if not self.queue.empty():
item = self.queue.get()
print("Consumer thread 1: Removed item {} from the queue".format(item))
else:
print("Consumer thread 1: Queue is empty")
time.sleep(2)
class ConsumerThread2(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
if not self.queue.empty():
item = self.queue.get()
print("Consumer thread 2: Removed item {} from the queue".format(item))
else:
print("Consumer thread 2: Queue is empty")
time.sleep(2)
if __name__ == "__main__":
q = queue.Queue()
producer_thread = ProducerThread(q)
consumer_thread1 = ConsumerThread1(q)
consumer_thread2 = ConsumerThread2(q)
producer_thread.start()
consumer_thread1.start()
consumer_thread2.start()
上述代码中,首先定义了一个队列 q
,作为生产者和消费者之间的共享资源。然后,我们定义了三个线程:生产者线程 ProducerThread
,消费者线程 ConsumerThread1
和 ConsumerThread2
。在每个线程的 __init__
方法中,我们都将共享队列 q
作为参数传入,以便这些线程在运行时可以访问到共享资源。
在生产者线程 ProducerThread
中,我们定义了一个 run
方法,用于启动该线程。在 run
方法中,我们使用循环来向队列中添加元素,这里只添加了 10 个元素,但你可以根据具体情况来设定添加的元素数量。另外,每当生产者往队列中添加一个元素时,它就会打印一条日志,表示已经将该元素添加到队列中。
在消费者线程 ConsumerThread1
和 ConsumerThread2
中,我们同样定义了一个 run
方法,用于启动该线程。在 run
方法中,我们使用一个无限循环来不断读取队列中的元素。如果队列不为空,则读取队列中的元素,并打印一条日志;否则,打印另一条日志,表示队列为空。
最后,在 main
函数中,我们创建了一个队列 q
和三个线程:生产者线程、消费者线程1 和消费者线程2。然后,分别启动这三个线程,并等待它们结束。
共享队列是一种非常实用的线程间通信方式,它可以很好地协调多个线程之间的工作,并完成数据的共享和交换。在实际开发中,我们可以根据具体的需求,灵活地运用共享队列,从而提高程序的并发能力和性能。