线程间通信
线程之间有时需要进行通信,而操作系统提供了多种机制来实现进程间的通信。其中,我们经常使用的一种方式是使用队列(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()
方法启动各个线程的执行。
通过以上代码,我们可以实现多个线程之间的通信,实现了生产者线程将数据放入队列中,多个消费者线程从队列中取出数据的过程。这样,我们就完成了线程间的通信。
进阶案例
【Python】Python 实现猜单词游戏——挑战你的智力和运气!
【python】Python tkinter库实现重量单位转换器的GUI程序
【python】使用Selenium获取(2023博客之星)的参赛文章
【python】使用Selenium和Chrome WebDriver来获取 【腾讯云 Cloud Studio 实战训练营】中的文章信息
使用腾讯云 Cloud studio 实现调度百度AI实现文字识别
【玩转Python系列【小白必看】Python多线程爬虫:下载表情包网站的图片
【玩转Python系列】【小白必看】使用Python爬取双色球历史数据并可视化分析
【玩转python系列】【小白必看】使用Python爬虫技术获取代理IP并保存到文件中
【小白必看】Python图片合成示例之使用PIL库实现多张图片按行列合成
【小白必看】Python爬虫实战之批量下载女神图片并保存到本地
【小白必看】使用Python爬取喜马拉雅音频并保存的示例代码
【小白必看】使用Python批量下载英雄联盟皮肤图片的技术实现
【小白必看】轻松获取王者荣耀英雄皮肤图片的Python爬虫程序
【小白必看】Python爬虫实战:获取阴阳师网站图片并自动保存
小白实战100案例: 完整简单的双色球彩票中奖判断程序,适合小白入门
使用 geopandas 和 shapely(.shp) 进行地理空间数据处理和可视化
爬虫入门指南(7):使用Selenium和BeautifulSoup爬取豆瓣电影Top250实例讲解【爬虫小白必看】
爬虫入门指南(6):反爬虫与高级技巧:IP代理、User-Agent伪装、Cookie绕过登录验证及验证码识别工具
爬虫入门指南(5): 分布式爬虫与并发控制 【提高爬取效率与请求合理性控制的实现方法】
爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法
爬虫入门指南(3):Python网络请求及常见反爬虫策略应对方法
深度学习模型在图像识别中的应用:CIFAR-10数据集实践与准确率分析
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
使用Python和Selenium自动化爬取 #【端午特别征文】 探索技术极致,未来因你出“粽” # 的投稿文章
Python多线程与多进程教程:全面解析、代码案例与优化技巧
Python入门教程:掌握for循环、while循环、字符串操作、文件读写与异常处理等基础知识