Python3中多线程编程的队列运作示例
作者:goldensun 发布时间:2022-06-15 23:27:49
标签:Python,线程
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(),程序会一直循环下去。
0
投稿
猜你喜欢
- 原文:10 Principles Of Effective Web Design翻译:熊猫2008-02-03本文由熊猫同学授权翻译首发。并
- php的命名空间功能已经出来很久了,但是一直以来没怎么深究过,这次赶着有时间所以特意翻着手册做一个整理和总结帮助自己完善完善,原本准备一篇写
- 如何使用mailto?1)基本用法<a href=mailto:sample@163.com>send em
- 一般写ASP PHP代码的朋友都估计是采用直接操作SQL的吧~ 看以下的代码 <% dim conn,rs&nbs
- BN与Dropout共同使用出现的问题BN和Dropout单独使用都能减少过拟合并加速训练速度,但如果一起使用的话并不会产生1+1>2
- 要在用户浏览器上安装cookie,HTTP服务器向HTTP响应添加类似以下内容的HTTP报头:Set-Cookie:session=8345
- 在更改列顺序之前,你需要考虑是否的确需要更改表中的列顺序。SQL的核心要点是从数据存储格式获取应用。总应指定检索数据的顺序。在下面的第1条语
- “位置:首页 第一屏通栏 格式:jpg 尺寸:960*90 ……”在工作我们经常会接到这样的banner设计需求,由
- 一、 操作数据库(mysql)的工具1.1命令行工具1.2navicat界面化工具1.3phpAdmin界面化工具一般情况下安装phpstu
- 本文实例讲述了Python Django框架实现应用添加logging日志。分享给大家供大家参考,具体如下:Django uses Pyth
- 目录urllib库作用Urllib 库下的几种模块的基本使用一、urllib.request模块1.功能2.常用方法参数说明:总结urlli
- python实现阶乘-基础版本什么是阶乘呢?在数学运算中n!表示n的阶乘,用数学公式表示为:n!=1*2*3*....*(n-1)*n下面提
- 本片博文主要介绍在Python3 环境下把用户名密码编码成字符串。代码如下:import base64def get_basic_auth_
- 本文主要讲述的是Python中的模块的概念,具体如下。模块是python组织代码的基本方式:python的脚本都是用扩展名为py的文本文件保
- PIL:使用python自带图像处理库读取出来的图片格式numpy:使用python-opencv库读取出来的图片格式tensor:pyto
- 一、自定义分页1、基础版自定义分页data = []for i in range(1, 302): tmp = {"i
- 切片:方便截取list、tuple、字符串部分索引的内容正序切片语法:dlist = doList[0:3]表示,从索引0开始取,直到索引3
- 其实这个东西没什么技术含量,就是给大家提供一个给表格加滚动条的思路。运行代码框<html><head><tit
- # -*- coding: utf8 -*- #! python print(repr("测试报警,xxxx是大猪头".
- 看到网上有一篇文章,是介绍如何做网站测试的.从一开始的链接测试,页面内容测试,到浏览器兼容性测试,负载压力测试,一直到最后的安全性测试,甚至