Python多线程和队列操作实例
作者:junjie 时间:2023-02-06 07:23:54
Python3,开一个线程,间隔1秒把一个递增的数字写入队列,再开一个线程,从队列中取出数字并打印到终端
#! /usr/bin/env python3
import time
import threading
import queue
# 一个线程,间隔一定的时间,把一个递增的数字写入队列
# 生产者
class Producer(threading.Thread):
def __init__(self, work_queue):
super().__init__() # 必须调用
self.work_queue = work_queue
def run(self):
num = 1
while True:
self.work_queue.put(num)
num = num+1
time.sleep(1) # 暂停1秒
# 一个线程,从队列取出数字,并显示到终端
class Printer(threading.Thread):
def __init__(self, work_queue):
super().__init__() # 必须调用
self.work_queue = work_queue
def run(self):
while True:
num = self.work_queue.get() # 当队列为空时,会阻塞,直到有数据
print(num)
def main():
work_queue = queue.Queue()
producer = Producer(work_queue)
producer.daemon = True # 当主线程退出时子线程也退出
producer.start()
printer = Printer(work_queue)
printer.daemon = True # 当主线程退出时子线程也退出
printer.start()
work_queue.join() # 主线程会停在这里,直到所有数字被get(),并且task_done(),因为没有调用task_done(),所在这里会一直阻塞,直到用户按^C
if __name__ == '__main__':
main()
queue是线程安全的,从多个线程访问时无需加锁。
如果在work_queue.get()之后调用work_queue.task_done(),那么在队列空时work_queue.join()会返回。
这里work_queue.put()是间隔一定时间才往队列放东西,如果调用work_queue.task_done(),在数字1被get()后,队列空时,join()就返回,程序就结束了。
也就是程序只打印了1然后就退出了。
所以在这种使用情景下,不能调用task_done(),程序会一直循环下去。
https://docs.python.org/3/library/queue.html
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
OpenCV2从摄像头获取帧并写入视频文件的方法
Python的Django框架中从url中捕捉文本的方法
Python3+Appium安装使用教程
![](https://img.aspxhome.com/file/2023/6/77906_0s.png)
Python调用adb命令实现对多台设备同时进行reboot的方法
python中unittest框架应用详解
详解Hadoop 运行环境搭建过程
5个提高你站点可读性的方法
![](https://img.aspxhome.com/file/UploadPic/20111/31/1348370-83s.jpg)
详解python的super()的作用和原理
pytorch 一行代码查看网络参数总量的实现
![](https://img.aspxhome.com/file/2023/8/89138_0s.jpg)
Django卸载之后重新安装的方法
用Python制作简单的钢琴程序的教程
![](https://img.aspxhome.com/file/2023/5/133865_0s.png)
解决python pandas读取excel中多个不同sheet表格存在的问题
![](https://img.aspxhome.com/file/2023/2/110282_0s.jpg)
MySQL重置root密码提示"Unknown column ‘password"的解决方法
selenium执行js并绕过webdriver监测常见方法
网站中文字的视觉设计
![](https://img.aspxhome.com/file/UploadPic/20084/16/2008416134135478s.jpg)
pycharm下打开、执行并调试scrapy爬虫程序的方法
![](https://img.aspxhome.com/file/2023/5/66785_0s.png)
python 获取一个值在某个区间的指定倍数的值方法
浅析SQL Server中包含事务的存储过程
vue实现表单验证功能
![](https://img.aspxhome.com/file/2023/2/122002_0s.jpg)