python模拟生产者消费者进程可视化tkinter
python模拟生产者消费者进程可视化tkinter
- 模拟内容要求
- 一、效果截图
- 二、代码实现
- 说明
模拟内容要求
利用C语言或JAVA语言或C++语言(手段不限),验证生产者与消费问题的过程。
一、效果截图
二、代码实现
from tkinter import *
from PIL import Image, ImageTk
import threading
import time
from queue import Queueclass Application(Frame):def __init__(self, master=None):super().__init__(master)self.master = masterself.pack()photo = Image.open("images/apple.png").resize((32, 32))self.img = ImageTk.PhotoImage(photo)self.x1 = 20self.x2 = 20self.createWidget()def createWidget(self):"""创建组件"""# 1.开始按钮self.b_start = Button(root, text="开始", width=10, height=1, command=self.start)self.b_start.place(relx=0.45, rely=0.11)# 2.生产者进程self.canvas1 = Canvas(root, width=210, height=50, bg="white")self.canvas1.place(relx=0.1, rely=0.08)self.canvas1.create_text(105, 25, text="生产者进程")self.b_produce = Button(root, text="开始生产", width=10, height=1, state="disabled", command=self.pro)self.b_produce.place(relx=0.1, rely=0.3)self.b_stop1 = Button(root, text="停止生产", width=10, height=1, state="disabled", command=self.stop1)self.b_stop1.place(relx=0.235, rely=0.3)# 3.缓冲器(队列)self.canvas2 = Canvas(root, width=350, height=80, bg="white")self.canvas2.place(relx=0.33, rely=0.4)self.canvas2.create_text(175, 40, text="缓冲器")# 4.消费者进程self.canvas3 = Canvas(root, width=210, height=50, bg="white")self.canvas3.place(relx=0.7, rely=0.6)self.canvas3.create_text(105, 25, text="消费者进程")self.b_consume = Button(root, text="开始消费", width=10, height=1, state="disabled", command=self.con)self.b_consume.place(relx=0.7, rely=0.78)self.b_stop2 = Button(root, text="停止消费", width=10, height=1, state="disabled", command=self.stop2)self.b_stop2.place(relx=0.835, rely=0.78)# 5.图片self.canvas1.create_image(20, 40, tag="pic1", image=self.img)self.canvas3.create_image(20, 40, tag="pic2", image=self.img)def start(self):"""点击开始按钮"""self.b_stop1["state"] = "normal" # 停止生产按钮解禁self.b_consume["state"] = "normal" # 开始消费按钮解禁self.b_start["state"] = "disabled" # 开始按钮禁用produce.start() # 开始执行生产者线程consume.start() # 开始执行消费者线程# 停止生产def stop1(self):self.b_produce["state"] = "normal" # 开始生产按钮解禁self.b_stop1["state"] = "disabled" # 停止生产按钮禁用produce.pause() # 将暂停线程的标识设置为False# 开始生产def pro(self):self.b_stop1["state"] = "normal" # 停止生产按钮解禁self.b_produce["state"] = "disabled" # 开始生产按钮禁用# 当队列消费品满时 不做任何操作if q.qsize() == 9:returnproduce.resume() # 将暂停线程的标识设置为True# 开始消费def con(self):self.b_stop2["state"] = "normal"self.b_consume["state"] = "disabled"# 当队列没有消费品时 不做任何操作if q.qsize() == 0:returnconsume.resume() # 将暂停线程的标识设置为True# 停止消费def stop2(self):self.b_consume["state"] = "normal"self.b_stop2["state"] = "disabled"consume.pause() # 将暂停线程的标识设置为False# 渲染缓冲器(队列)的图片def buffer(self):size = q.qsize()self.canvas2.delete("all")self.canvas2.create_text(175, 40, text="缓冲器")for i in range(size):self.canvas2.create_image(20+39*i, 60, image=self.img)# 自定义生产者线程类
class produceThread(threading.Thread):def __init__(self):super().__init__()self.__flag = threading.Event() # 用于暂停线程的标识 默认为Falseself.__flag.set() # 设置为Truedef run(self):while True:app.canvas1.delete("pic1")while app.x1 < 250:app.canvas1.create_image(app.x1, 40, tag="pic1", image=app.img)app.canvas1.update()self.__flag.wait() # 为True则立即返回 为False时阻塞直到内部的标识位为True后返回time.sleep(0.05)app.canvas1.delete("pic1")app.x1 += 10app.x1 = 20q.put(1)app.buffer()# 当可消费的对象溢出的时候if q.qsize() == 9:app.canvas1.create_image(app.x1, 40, tag="pic1", image=app.img)app.stop1()# 停止线程def pause(self):self.__flag.clear() # 设置为False 让线程阻塞# 执行线程def resume(self):self.__flag.set() # 设置为True 让线程停止阻塞# 自定义消费者线程类
class consumeThread(threading.Thread):def __init__(self):super().__init__()self.__flag = threading.Event() # 用于暂停线程的标识 默认为Falsedef run(self):while True:app.canvas1.delete("pic2")while app.x2 < 250:app.canvas3.create_image(app.x2, 40, tag="pic2", image=app.img)app.canvas3.update()self.__flag.wait() # 为True则立即返回 为False时阻塞直到内部的标识位为True后返回time.sleep(0.05)app.canvas3.delete("pic2")app.x2 += 10app.x2 = 20q.get()app.buffer()# 没有可消费的对象的时候if q.qsize() == 0:app.canvas3.create_image(app.x2, 40, tag="pic2", image=app.img)app.stop2()# 停止线程def pause(self):self.__flag.clear() # 设置为False 让线程阻塞# 执行线程def resume(self):self.__flag.set() # 设置为True 让线程停止阻塞if __name__ == '__main__':root = Tk()root.geometry('1000x500+500+200')root.title('模拟生产者消费者进程')app = Application(master=root)q = Queue(maxsize=9)produce = produceThread()consume = consumeThread()produce.setDaemon(True) # 设置线程守护consume.setDaemon(True) # 设置线程守护root.mainloop()
说明
根据计算机系统实验要求制作,原创,使用python内置模块tkinter实现,只需要修改里面图片的路径即可
python模拟生产者消费者进程可视化tkinter相关推荐
- python之生产者消费者模型
python之生产者消费者模型 生产者消费者模型作用于: 1.爬虫的时候 2.分布式操作:celery 其本质:就是让生产数据和消费数据的效率达到平衡并且最大化的效率 为什么要使用生产者消费者模型? ...
- 并发编程(五)python实现生产者消费者模式多线程爬虫
并发编程专栏系列博客 并发编程(一)python并发编程简介 并发编程(二)怎样选择多线程多进程和多协程 并发编程(三)Python编程慢的罪魁祸首.全局解释器锁GIL 并发编程(四)如何使用多线程, ...
- C++编程模拟生产者消费者模型
生产者消费者问题是操作系统中典型的进程同步互斥问题,(英语:Producer-Consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...
- 使用Python实现生产者消费者问题
之前用C++写过一篇生产者消费者的实现. 生产者和消费者主要是处理互斥和同步的问题: 队列作为缓冲区,需要互斥操作 队列中没有产品,消费者需要等待,直到生产者放入产品并通知它.队列慢的情况类似. 这里 ...
- 操作系统——Python:生产者——消费者
标题:Python生产者--消费者模型 本文章的生产者是可以选择多个的,同样消费者也是可以选择多个的,所以中间过程只能用文字叙述,不能用图片来演示(图片需要布局) 先说明,缓冲区最大限制定义了为10, ...
- python 异步 生产者 消费者_python 生产者消费者模式 - 刘江的python教程
生产者消费者模式 阅读: 9884 评论:4 利用多线程和队列可以实现生产者消费者模式.该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度. 什么是生产者和消费者? 在线程世界里, ...
- 模拟生产者-消费者问题和读者-写者问题
生产者-消费者问题 一组生产者进程生产产品给一组消费者进程消费.一个有n个缓冲区的缓冲池,生产者一次向一个缓冲区中投入消息,消费者从一个缓冲区中取得.生产者--消费者问题实际上是相互合作进程关系的一种 ...
- (python)生产者消费者模型
生产者消费者模型当中有两大类重要的角色,一个是生产者(负责造数据的任务),另一个是消费者(接收造出来的数据进行进一步的操作). 为什么要使用生产者消费者模型? 在并发编程中,如果生产者处理速度很快,而 ...
- Linux多线程实现生产者消费者进程(Linux+window代码)
原文链接:我的个人链接 Linux 常用多线程函数 pthread_create():创建一个线程 pthread_exit():退出一个线程 pthread_jion():阻塞当前线程,直到另一个线 ...
最新文章
- 虚函数中的变量作用域问题
- Apache Spark 2.2.0 中文文档 - GraphX Programming Guide | ApacheCN
- [转]撞车之后,不要傻里傻气的!
- 链式运动JavaScript实现
- JVM调优总结(九)-新一代的垃圾回收算法
- 云+X案例展 | 传播类:九州云 SD-WAN 携手上海电信,助力政企客户网络重构换新颜...
- GMF 教程 Mindmap 6
- TeamCity+Rancher+Docker实现.Net Core项目DevOps(目前成本最小的DevOps实践)
- 天眼探空经济发展_“天眼”探空惊艳全球
- 基于MFC的简易TCP/IP调试助手开发
- 贝叶斯算法详解和拉普拉斯平滑
- proteus仿真 引脚显示电平变化但不能显示波形
- Photoshop照片模糊变清晰大全
- c语言四则混合运算可以带括号,带小括号的四则混合运算听后感
- Bandizip下载网盘地址
- 中青网财经:请一位心理学博士当CTO 只有马云敢这么做
- 嵌入式服务器appweb交叉编译指南
- Python数据分析实战【十二】:机器学习决策树算法案例实战【文末源码地址】
- 《爬虫爬 wallhaven.cc壁纸》
- Matlab S函数求解PD控制的二阶微分或者二阶状态方程