Python多线程Thread——生产者消费者模型

import random
import threading
import timeLock = threading.Lock()books = 10  # 图书馆书籍数量
b_rt = 0    # 外面持有数量(借出去的数量)def ba():global booksbooks += 1print("进书1本")t = threading.Timer(10, ba) t.start()def rent():global b_rtglobal bookswhile True:time.sleep(1)if not books:Lock.locked() print('图书馆没有书了')continueif Lock.locked():Lock.release()n = random.randint(1, books) + 1if books - n < 0:n = booksbooks -= nb_rt += nprint(f"借出去了{n}本,还剩{books},外面{b_rt}")def rt():global b_rtglobal bookswhile True:time.sleep(2)if not b_rt:Lock.locked()continueif Lock.locked():Lock.release()m = random.randint(1, b_rt) - 1books += mb_rt -= mprint(f"归还{m}本,还剩{books},外面{b_rt}")t1 = threading.Thread(target=rent, args=())
t2 = threading.Thread(target=rt, args=())
ba() # Timer任务会独立启用一个线程
t1.start()
t2.start()
t1.join()
t2.join()

下面面向对象的角度看线程

import threading
import time# 创建一个线程类
class Eat(threading.Thread):def __init__(self, name, s: int):# 类继承要注意super函数,这里的target可以不写,默认是run。目的是线程启动调用的是run方法super(Eat, self).__init__(target=self.run)self.name = nameself.s = s  # 定义一个时间间隔def run(self):  # 构建主函数。线程启动后运行的是此方法while True:time.sleep(self.s)print(f"{self.name}在吃饭")if __name__ == '__main__':aron = Eat("aron", 5)aron.start()  # 线程启动后会持续运行# 再实例一个线程lily = Eat("lily", 2)lily.start()# 所有线程都运行再一个进程上,他们单独运行互不影响。除非他们调用了进程上的公共属性# 比如你可以把时间设置为进程上的一个变量,例如:# step = 2# aron = Eat("aron", step)# lily = Eat("lily", step)

那么你可以试试看能不能用面向对象的方法实现生产者消费者模型吧。

python队列与多线程——生产者消费者模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/72781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盖子的c++小课堂——第二十二讲:2维dp

前言 大家好&#xff0c;我又来更新了&#xff0c;今天终于有时间了aaaaaaaa 破500粉了&#xff0c;我太高兴了哈哈哈哈哈哈&#xff08;别看IP地址&#xff0c;我去北京旅游回来了&#xff0c;他没改回来&#xff09;&#xff0c;然后我马上就成为创作者一年了&#xff0c;希…

Gitea--私有git服务器搭建详细教程

一.官方文档 https://docs.gitea.com/zh-cn/说明 gitea 是一个自己托管的Git服务程序。他和GitHub, Gitlab等比较类似。他是从 Gogs 发展而来&#xff0c;gitea的创作团队重新fork了代码&#xff0c;并命名为giteagitea 功能特性多&#xff0c;能够满足我们所有的的代码管理需…

Java基于 SpringBoot 的车辆充电桩系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1、效果演示效果图技术栈 2、 前言介绍&#xff08;完整源码请私聊&#xff09;3、主要技术3.4.1 …

C语言文本为什么不包括库函数和预处理命令

C语言的文本不包括库函数和预处理命令 是因为库函数和预处理命令并不是C语言本身的一部分&#xff0c; 它们是由C语言标准库和预处理器提供的功能。 C语言标准库是一组预定义的函数和常量&#xff0c; 用于提供常见的功能&#xff0c;如输入输出、字符串处理、数学计算等。 …

WordPress 后台密码忘记后,重置找回密码的 N 种方法

文章目录 一、通过其他管理员修改密码二、通过电子邮件找回密码三、通过 MySQL 命令行设置新密码四、主题文件functions.php添加代码重置密码五、使用官方脚本重置密码 忘记密码是每个人都会遇到的事情&#xff0c;长时间不登录 WordPress 站点后&#xff0c;作为管理员的你&am…

国密SSL证书是什么?cfca的证书靠谱吗

2019年&#xff0c;《中华人民共和国密码法》第三章表明&#xff1a;“国家鼓励在外商投资过程中基于自愿原则和商业规则开展商用密码技术合作。” 2020年&#xff0c;《中华人民共和国密码法》正式施行&#xff0c; 标志着国家在提升密码工作的科学化、规范化、法治化水平&am…

TLA+学习记录1——hello world

0x01 TLA是个好工具 编程人员一个好习惯是凡事都想偷懒&#xff0c;当然是指要科学地偷懒&#xff0c;而不是真的偷懒。一直想找到一种能检验写出的代码&#xff0c;做出的设计是否真的完全正确&#xff0c;而不是靠经验检视、代码Review、反复测试去检验。因为上述方法不管怎…

End-to-End Object Detection with Transformers(论文解析)

End-to-End Object Detection with Transformers 摘要介绍相关工作2.1 集合预测2.2 transformer和并行解码2.3 目标检测 3 DETR模型3.1 目标检测集设置预测损失3.2 DETR架构 摘要 我们提出了一种将目标检测视为直接集合预测问题的新方法。我们的方法简化了检测流程&#xff0c…

借助AI分析哥斯拉木马原理与Tomcat回显链路挖掘

前言 本次分析使用了ChatGPT进行辅助分析&#xff0c;大大提升了工作效率&#xff0c;很快就分析出木马的工作流程和构造出利用方式。 分析 首先对该木马进行格式化,以增强代码的可读性。得到如下代码 <jsp:root xmlns:jsp"http://java.sun.com/JSP/Page" vers…

基于Python开发的五子棋小游戏(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的五子棋小游戏&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&a…

Go语言入门指南

Go语言入门指南 Go语言&#xff0c;通常称为Golang&#xff0c;是一门由Google开发的开源编程语言。它因其简洁、高效和强大的特性而备受开发者欢迎。本篇博客将带你深入了解Go语言的基础知识&#xff0c;让你能够开始编写自己的Go程序。 为什么选择Go语言&#xff1f; 在学…

踩了大坑:wordpress后台 无法将上传的文件移动至wp-content

一、问题描述 今天迁移了wordpress站点至新服务器&#xff0c;结果上传图片出现“无法将上传的文件移动至wp-content/uploads”的提示&#xff0c;这是怎么回事&#xff0c;为什么会这样。 报错如下&#xff1a; 2023/02/20 08:57:48 [error] 9861#9861: *79624 FastCGI sen…

斯坦福小镇升级版——AI-Town搭建指南

导语&#xff1a; 8月份斯坦福AI小镇开源之后&#xff0c;引起了 AIGC 领域的强烈反响&#xff0c;但8月份还有另一个同样非常有意义的 AI-Agent 的项目开源&#xff0c;a16z主导的 AI-Town 本篇文章主要讲解如何搭建该项目&#xff0c;如有英文基础或者对这套技术栈熟悉&#…

TCP之三次握手四次挥手

在前面的文章中我们了解到http是基于TCP/IP协议的&#xff0c;这篇文章我们来了解一下TCP/IP。 一、TCP与UDP 1、UDP 基于非连接。类似于写信&#xff0c;不能保证对方能不能接收到&#xff0c;接收到的内容是否完整&#xff0c;顺序是否正确。 优缺点&#xff1a;性能损耗小…

云数据库知识学习——概述

一、云计算是云数据库兴起的基础 云计算是分布式计算、并行计算、效用计算、网络存储、虚拟化、负载均衡等计算机和网络技术发展融合的产物。云计算是由一系列可以动态升级和被虚拟化的资源组成的&#xff0c;用户无需掌握云计算的技术&#xff0c;只要通过网络就可以访问这些资…

Maven中导入jQuery,前端页面中引用jQuery

第一步pom文件中&#xff0c;配置maven坐标。 第二步&#xff0c;在前端页面中引用jQuery 注&#xff1a;该前端页面需要在web根目录即webapp目录下。可认为在maven中导入jQuery后&#xff0c;jquery.min.js文件放在目录webapp/webjars/jquery/3.3.1下。

java实现本地文件转文件流发送到前端

java实现本地文件转文件流发送到前端 Controller public void export(HttpServletResponse response) {// 创建file对象response.setContentType("application/octet-stream");// 文件名为 sresponse.setHeader("Content-Disposition", "attachment;…

【C# Programming】编程入门:方法和参数

一、方法 1、方法的定义 由一系列以执行特定的操作或计算结果语句组成。方法总是和类关联&#xff0c;类型将相关的方法分为一组。 方法名称 形参和实参(parameter & argument)返回值 2、命名空间 一种分类机制&#xff0c;用于组合功能相关的所有类型。命名空间是分级…

架构师成长之路|Redis实现延迟队列的三种方式

延迟队列实现 基于监听key过期实现的延迟队列实现,这里需要继承KeyspaceEventMessageListener类来实现监听redis键过期 public class KeyExpirationEventMessageListener extends KeyspaceEventMessageListener implementsApplicationEventPublisherAware {private static f…

HarmonyOS开发:探索动态共享包的依赖与使用

前言 所谓共享包&#xff0c;和Android中的Library本质是一样的&#xff0c;目的是为了实现代码和资源的共享&#xff0c;在HarmonyOS中&#xff0c;给开发者提供了两种共享包&#xff0c;HAR&#xff08;Harmony Archive&#xff09;静态共享包&#xff0c;和HSP&#xff08;H…