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通过线程实现定时器timer的方法
Mar 16 Python
为Python程序添加图形化界面的教程
Apr 29 Python
在Django中限制已登录用户的访问的方法
Jul 23 Python
python smtplib发送带附件邮件小程序
May 22 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
Jun 11 Python
python使用turtle库绘制树
Jun 25 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 Python
Pytorch转tflite方式
May 25 Python
Python安装并操作redis实现流程详解
Oct 13 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 Python
Python基于Opencv识别两张相似图片
Apr 25 Python
使用Pytorch实现two-head(多输出)模型的操作
May 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,不用COM,生成excel文件
2006/10/09 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
2013/04/08 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
php pdo操作数据库示例
2017/03/10 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
Python实现定时任务
2017/02/08 Python
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
Python计算信息熵实例
2020/06/18 Python
什么是TCP/IP
2014/07/27 面试题
教师节促销方案
2014/03/22 职场文书
护士上岗前培训自我鉴定
2014/04/20 职场文书
《长征》教学反思
2014/04/27 职场文书
求职信范文大全
2014/05/26 职场文书
离婚协议书范文2014
2014/10/16 职场文书
2014年节能工作总结
2014/12/18 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
个人收入证明格式
2015/06/24 职场文书
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android