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 相关文章推荐
pyside写ui界面入门示例
Jan 22 Python
从零学Python之入门(三)序列
May 25 Python
Python文件去除注释的方法
May 25 Python
Python数据类型详解(二)列表
May 08 Python
Python制作简易注册登录系统
Dec 15 Python
python pycurl验证basic和digest认证的方法
May 02 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
python3发送邮件需要经过代理服务器的示例代码
Jul 25 Python
如何让python的运行速度得到提升
Jul 08 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 Python
python实现求纯色彩图像的边框
Apr 08 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
ajax取消挂起请求的处理方法
2013/03/18 PHP
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
JS实现字体选色板实例代码
2013/11/20 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
简单讲解AngularJS的Routing路由的定义与使用
2016/03/05 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
python2.7的编码问题与解决方法
2016/10/04 Python
python用插值法绘制平滑曲线
2021/02/19 Python
django的csrf实现过程详解
2019/07/26 Python
django 微信网页授权登陆的实现
2019/07/30 Python
Django中的静态文件管理过程解析
2019/08/01 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
python绘制趋势图的示例
2020/09/17 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
十岁生日家长答谢词
2014/01/17 职场文书
四年级评语大全
2014/04/21 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
百年校庆感言
2015/08/01 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
golang import自定义包方式
2021/04/29 Golang