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 httplib,smtplib使用方法
Sep 06 Python
wxPython窗口的继承机制实例分析
Sep 28 Python
Python导入oracle数据的方法
Jul 10 Python
Python并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
Flask框架Jinjia模板常用语法总结
Jul 19 Python
Python3 Post登录并且保存cookie登录其他页面的方法
Dec 28 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
Jun 21 Python
Django中的cookie和session
Aug 27 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
Apr 22 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
Python 字符串池化的前提
Jul 03 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 文件上传系统手记
2009/10/26 PHP
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
js 分栏效果实现代码
2009/08/29 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
怎么清空javascript数组
2013/05/11 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
JS实现生成由字母与数字组合的随机字符串功能详解
2018/05/25 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
Django的性能优化实现解析
2019/07/30 Python
Django--权限Permissions的例子
2019/08/28 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
css3 中的新特性加强记忆详解
2016/04/16 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
应用化学专业本科生求职信
2013/09/29 职场文书
大学毕业生的自我鉴定
2013/11/30 职场文书
个人简历自我评价范文
2014/02/04 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
大学学生个人总结
2015/02/15 职场文书
社区结对共建协议书
2016/03/23 职场文书
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis