Python3中多线程编程的队列运作示例


Posted in Python onApril 16, 2015

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(),程序会一直循环下去。

Python 相关文章推荐
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
python直接访问私有属性的简单方法
Jul 25 Python
python GUI实例学习
Nov 21 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
django表单的Widgets使用详解
Jul 22 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 Python
Python描述符descriptor使用原理解析
Mar 21 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
使用Keras中的ImageDataGenerator进行批次读图方式
Jun 17 Python
django注册用邮箱发送验证码的实现
Apr 18 Python
python实现黄金分割法的示例代码
Apr 28 Python
使用Python脚本操作MongoDB的教程
Apr 16 #Python
使用Python中的greenlet包实现并发编程的入门教程
Apr 16 #Python
利用Python的Twisted框架实现webshell密码扫描器的教程
Apr 16 #Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 #Python
使用Python的Twisted框架编写简单的网络客户端
Apr 16 #Python
从Python的源码浅要剖析Python的内存管理
Apr 16 #Python
用Python实现换行符转换的脚本的教程
Apr 16 #Python
You might like
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
js导出txt示例代码
2014/01/14 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
javascript创建含数字字母的随机字符串方法总结
2016/08/01 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
教你安装python Django(图文)
2013/11/04 Python
python中for语句简单遍历数据的方法
2015/05/07 Python
在Python的Flask框架中构建Web表单的教程
2016/06/04 Python
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
python逆序打印各位数字的方法
2018/06/25 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
python的faker库用法
2019/11/28 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
大学生求职信范文应怎么写
2014/01/01 职场文书
医药专业应届毕业生求职信范文
2014/01/01 职场文书
高三自我评价
2014/02/01 职场文书
学生打架检讨书
2014/02/14 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis
Golang 实现WebSockets
2022/04/24 Golang
Spring Boot 实现 WebSocket
2022/04/30 Java/Android