线程之间有时需要进行通信,而操作系统提供了多种机制来实现进程间的通信。其中,我们经常使用的一种方式是使用队列(Queue)。
Queue是一个先进先出(First In First Out)的队列。主线程中创建一个Queue对象,并作为参数传递给子线程。通过put()方法将数据放入队列中,通过get()方法从队列中取出数据。在调用get()方法后,队列中的数据会被同时删除。我们可以使用multiprocessing
模块中的Queue实现多线程之间的数据传递。
import threading
import time
from queue import Queue
# 生产者函数,用于将数据放入队列中
def producer(queue):
for i in range(100):
print('{}存入了{}'.format(threading.current_thread().name, i))
queue.put(i)
time.sleep(0.1)
# 消费者函数,用于从队列中取出数据
def consumer(queue):
for x in range(100):
value = queue.get()
print('{}取到了{}'.format(threading.current_thread().name, value))
time.sleep(0.1)
if not value:
return
if __name__ == '__main__':
# 创建一个队列对象
queue = Queue()
# 创建多个线程,并将队列对象作为参数传递给线程函数
t1 = threading.Thread(target=producer, args=(queue,))
t2 = threading.Thread(target=consumer, args=(queue,))
t3 = threading.Thread(target=consumer, args=(queue,))
t4 = threading.Thread(target=consumer, args=(queue,))
t6 = threading.Thread(target=consumer, args=(queue,))
# 启动线程
t1.start()
t2.start()
t3.start()
t4.start()
t6.start()
在上述示例中,我们创建了一个Queue对象,并将其作为参数传递给多个线程。其中,producer
函数用于将数据放入队列中,consumer
函数用于从队列中取出数据。通过多个消费者线程的执行,可以实现多个线程之间对于共享队列的并发访问和通信。
threading
用于创建和管理线程,time
用于添加延迟效果,Queue
用于创建队列对象。producer(queue)
,接收一个队列对象作为输入参数。该函数用于将数据放入队列中。threading.current_thread().name
获取当前线程的名称,并打印存入的值。queue.put(i)
将数据放入队列中。time.sleep(0.1)
添加延迟效果。consumer(queue)
,同样接收一个队列对象作为输入参数。该函数用于从队列中取出数据。queue.get()
获取队列中的数据,同时也会将该数据从队列中删除。threading.current_thread().name
获取当前线程的名称,并打印取出的值。time.sleep(0.1)
添加延迟效果。queue
。t.start()
方法启动各个线程的执行。通过以上代码,我们可以实现多个线程之间的通信,实现了生产者线程将数据放入队列中,多个消费者线程从队列中取出数据的过程。这样,我们就完成了线程间的通信。