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里对list中的整数求平均并排序
Sep 12 Python
在Django的上下文中设置变量的方法
Jul 20 Python
Python函数的周期性执行实现方法
Aug 13 Python
解决uWSGI的编码问题详解
Mar 24 Python
python中解析json格式文件的方法示例
May 03 Python
Python制作词云的方法
Jan 03 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
Python自动化运维之Ansible定义主机与组规则操作详解
Jun 13 Python
python代码打印100-999之间的回文数示例
Nov 24 Python
使用Python解析Chrome浏览器书签的示例
Nov 13 Python
Python读取文件夹下的所有文件实例代码
Apr 02 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用数组返回无限分类的列表数据的代码
2010/08/08 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
php使用QueryList轻松采集js动态渲染页面方法
2018/09/11 PHP
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
JavaScript判断微信浏览器实例代码
2016/06/13 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
详解React 条件渲染
2020/07/08 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
Python Django使用forms来实现评论功能
2016/08/17 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
python如何构建mock接口服务
2021/01/28 Python
CSS3实现超酷的黑猫警长首页
2016/04/26 HTML / CSS
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
产品生产计划书
2014/05/07 职场文书
教师考核表个人总结
2015/02/12 职场文书
永不妥协观后感
2015/06/10 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
个人自我鉴定怎么写?
2019/07/01 职场文书
python某漫画app逆向
2021/03/31 Python
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript