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

标签:Python,多线程,队列
0
投稿

猜你喜欢

  • OpenCV2从摄像头获取帧并写入视频文件的方法

    2022-04-10 07:15:22
  • Python的Django框架中从url中捕捉文本的方法

    2023-08-29 11:13:13
  • Python3+Appium安装使用教程

    2023-08-22 13:38:32
  • Python调用adb命令实现对多台设备同时进行reboot的方法

    2022-08-06 02:40:45
  • python中unittest框架应用详解

    2023-05-26 14:27:42
  • 详解Hadoop 运行环境搭建过程

    2022-08-25 13:50:58
  • 5个提高你站点可读性的方法

    2011-01-31 17:48:00
  • 详解python的super()的作用和原理

    2022-07-06 15:55:37
  • pytorch 一行代码查看网络参数总量的实现

    2023-04-23 17:42:36
  • Django卸载之后重新安装的方法

    2023-07-23 18:27:58
  • 用Python制作简单的钢琴程序的教程

    2022-08-20 07:18:49
  • 解决python pandas读取excel中多个不同sheet表格存在的问题

    2022-03-12 06:59:33
  • MySQL重置root密码提示"Unknown column ‘password"的解决方法

    2024-01-14 19:57:54
  • selenium执行js并绕过webdriver监测常见方法

    2023-07-04 06:58:15
  • 网站中文字的视觉设计

    2008-04-16 13:35:00
  • pycharm下打开、执行并调试scrapy爬虫程序的方法

    2022-08-07 09:30:52
  • python 获取一个值在某个区间的指定倍数的值方法

    2023-04-08 17:19:07
  • 浅析SQL Server中包含事务的存储过程

    2024-01-15 21:27:39
  • vue实现表单验证功能

    2024-06-05 10:03:59
  • 微信支付、支付宝支付等常用第三方支付通道接口手续费对比

    2022-01-29 12:48:14
  • asp之家 网络编程 m.aspxhome.com