线程间通信
线程之间有时需要进行通信,而操作系统提供了多种机制来实现进程间的通信。其中,我们经常使用的一种方式是使用队列(Queue)。
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)
,接收一个队列对象作为输入参数。该函数用于将数据放入队列中。 - 在生产者函数中使用一个循环,从0到99,将每个数字依次放入队列中。
- 使用
threading.current_thread().name
获取当前线程的名称,并打印存入的值。 - 使用
queue.put(i)
将数据放入队列中。 - 使用
time.sleep(0.1)
添加延迟效果。 - 定义消费者函数
consumer(queue)
,同样接收一个队列对象作为输入参数。该函数用于从队列中取出数据。 - 在消费者函数中使用一个循环,从0到99,依次从队列中取出数据。
- 使用
queue.get()
获取队列中的数据,同时也会将该数据从队列中删除。 - 使用
threading.current_thread().name
获取当前线程的名称,并打印取出的值。 - 使用
time.sleep(0.1)
添加延迟效果。 - 如果取出的值为假值(即空),则返回函数,结束线程的执行。
- 在主程序中,创建一个队列对象
queue
。 - 创建多个线程,并将队列对象作为参数传递给线程函数,分别创建了一个生产者线程和多个消费者线程。
- 启动线程,通过
t.start()
方法启动各个线程的执行。
通过以上代码,我们可以实现多个线程之间的通信,实现了生产者线程将数据放入队列中,多个消费者线程从队列中取出数据的过程。这样,我们就完成了线程间的通信。