哲学家就餐问题python_Python实现哲学家就餐问题实例代码

哲学家就餐问题:

哲学家就餐问题是典型的同步问题,该问题描述的是五个哲学家共用一张圆桌,分别坐在五张椅子上,在圆桌上有五个盘子和五个叉子(如下图),他们的生活方式是交替的进行思考和进餐,思考时不能用餐,用餐时不能思考。平时,一个哲学家进行思考,饥饿时便试图用餐,只有在他同时拿到他的盘子左右两边的两个叉子时才能进餐。进餐完毕后,他会放下叉子继续思考。请写出代码来解决如上的哲学家就餐问题,要求代码返回“当每个哲学家分别需要进食 n 次”时这五位哲学家具体的行为记录。

rtihynjcq3h.jpg

测试用例:

输入:n = 1 (1<=n<=60,n 表示每个哲学家需要进餐的次数。)

预期输出:

[[4,2,1],[4,1,1],[0,1,1],[2,2,1],[2,1,1],[2,0,3],[2,1,2],[2,2,2],[4,0,3],[4,1,2],[0,2,1],[4,2,2],[3,2,1],[3,1,1],[0,0,3],[0,1,2],[0,2,2],[1,2,1],[1,1,1],[3,0,3],[3,1,2],[3,2,2],[1,0,3],[1,1,2],[1,2,2]]

思路:

输出列表中的每一个子列表描述了某个哲学家的具体行为,它的格式如下:

output[i] = [a, b, c] (3 个整数)

a 哲学家编号。

b 指定叉子:{1 : 左边, 2 : 右边}.

c 指定行为:{1 : 拿起, 2 : 放下, 3 : 吃面}。

如 [4,2,1] 表示 4 号哲学家拿起了右边的叉子。所有自列表组合起来,就完整描述了“当每个哲学家分别需要进食 n 次”时这五位哲学家具体的行为记录。

代码实现

import queue

import threading

import time

import random

class CountDownLatch:

def __init__(self, count):

self.count = count

self.condition = threading.Condition()

def wait(self):

try:

self.condition.acquire()

while self.count > 0:

self.condition.wait()

finally:

self.condition.release()

def count_down(self):

try:

self.condition.acquire()

self.count -= 1

self.condition.notifyAll()

finally:

self.condition.release()

class DiningPhilosophers(threading.Thread):

def __init__(self, philosopher_number, left_fork, right_fork, operate_queue, count_latch):

super().__init__()

self.philosopher_number = philosopher_number

self.left_fork = left_fork

self.right_fork = right_fork

self.operate_queue = operate_queue

self.count_latch = count_latch

def eat(self):

time.sleep(0.01)

self.operate_queue.put([self.philosopher_number, 0, 3])

def think(self):

time.sleep(random.random())

def pick_left_fork(self):

self.operate_queue.put([self.philosopher_number, 1, 1])

def pick_right_fork(self):

self.operate_queue.put([self.philosopher_number, 2, 1])

def put_left_fork(self):

self.left_fork.release()

self.operate_queue.put([self.philosopher_number, 1, 2])

def put_right_fork(self):

self.right_fork.release()

self.operate_queue.put([self.philosopher_number, 2, 2])

def run(self):

while True:

left = self.left_fork.acquire(blocking=False)

right = self.right_fork.acquire(blocking=False)

if left and right:

self.pick_left_fork()

self.pick_right_fork()

self.eat()

self.put_left_fork()

self.put_right_fork()

break

elif left and not right:

self.left_fork.release()

elif right and not left:

self.right_fork.release()

else:

time.sleep(0.01)

print(str(self.philosopher_number) + ' count_down')

self.count_latch.count_down()

if __name__ == '__main__':

operate_queue = queue.Queue()

fork1 = threading.Lock()

fork2 = threading.Lock()

fork3 = threading.Lock()

fork4 = threading.Lock()

fork5 = threading.Lock()

n = 1

latch = CountDownLatch(5 * n)

for _ in range(n):

philosopher0 = DiningPhilosophers(0, fork5, fork1, operate_queue, latch)

philosopher0.start()

philosopher1 = DiningPhilosophers(1, fork1, fork2, operate_queue, latch)

philosopher1.start()

philosopher2 = DiningPhilosophers(2, fork2, fork3, operate_queue, latch)

philosopher2.start()

philosopher3 = DiningPhilosophers(3, fork3, fork4, operate_queue, latch)

philosopher3.start()

philosopher4 = DiningPhilosophers(4, fork4, fork5, operate_queue, latch)

philosopher4.start()

latch.wait()

queue_list = []

for i in range(5 * 5 * n):

queue_list.append(operate_queue.get())

print(queue_list)

总结

到此这篇关于Python实现哲学家就餐问题的文章就介绍到这了,更多相关Python哲学家就餐内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

本文标题: Python实现哲学家就餐问题实例代码

本文地址: http://www.cppcns.com/jiaoben/python/362762.html

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

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

相关文章

fpga摄像头模块_FPGA开源项目:双目测距(一)之双目图像采集显示以及图片保存...

1.简述这个项目是大三下学期暑假(也就是2019年8份)完成的&#xff0c;当时的视频效果已发布在bilibili上&#xff0c;这是我们的省级的科研立项&#xff0c;其实就我一个人负责完成。发布bilibili后很多人比较感兴趣&#xff0c;打算年初回学校完成毕设期间开源的&#xff0c;一…

github ssh 配置_Github远程仓库克隆更新本机,SSH协议免密操作配置和注意事项

Github远程仓库-克隆远程仓库到本机 【重点】目标如何克隆远程仓库到本机呢&#xff1f;小结下载项目的命令&#xff1a;git clone https://gitee.com/kekesam/sassweb777.git注意&#xff1a;1&#xff1a;它会自动创建本地仓库&#xff1b;2&#xff1a;它也会自动和远程仓库…

golang中文文档_【译】Go 语言源码贡献官方指导文档

以前给 Go 语言项目源码提交过一些 commits&#xff0c;期间阅读他们的官方指导文档的时候觉得这篇指导文档可以作为绝佳的关于大型软件项目的规范管理的参考&#xff0c;因为最近又提交了几个 commits&#xff0c;就又把这篇文档再看了一遍&#xff0c;有感于 Go 团队在项目管…

mysql增加最大连接数_mysql最大连接数怎么设置

设置mysql最大连接数的方法&#xff1a;首先打开mysql的控制台&#xff1b;然后输入语句【set GLOBAL max_connections1000;】即可直接设置最大连接数。通常&#xff0c;mysql的最大连接数默认是100, 最大可以达到16384&#xff1b;如果我们想修改mysql的最大连接数&#xff0c…

让一个动画一直执行的属性是_iOS 动画 一

View AnimationsAnimatable properties• bounds: 改变 bounds 属性可以在当前 view 内改变子视图等的相对位置。• frame: 改变 frame 可以移动或者缩放 view 。• center: 当你想移动 view 到屏幕的新位置时&#xff0c;可以改变此属性。• backgroundColor: 背景颜色。• al…

阿里云java mysql环境_阿里云搭建centos java mysql nginx环境

1.上传下载yum install lrzszsz下载rz上传2.安装压缩命令yum install -y unzip zip;3.安装javarpm -ivh jdk-8u161-linux-x64.rpm4.安装mysqlyum install libaioyum -y remove mariadb-libs-5.5*rpm -ivh mysql-community-common-5.7.21-1.el7.x86_64.rpmrpm -ivh mysql-commun…

ide快捷键_一款好用的IDE怎么可以没有代码提示?

我在使用过IntelliJ IDEA(一款Java开发工具)之后&#xff0c;感觉Delphi的IDE在编写代码方面尤其是代码提示方面和IntelliJ IDEA相比真的天差地别&#xff0c;所以决定认真的研究一下Delphi的代码提示功能一般情况下我们使用Delphi的开发工具都会安装cnpack专家包&#xff0c;但…

IOS开发学习记录第4天之C语言学习

&#xff08;一&#xff09;、今天我们要学习的主要包括一下内容&#xff1a; 1、标示符概念及其命名原则 在C语言中&#xff0c;符号常量&#xff0c;变量&#xff0c;数组&#xff0c;函数等都需要一定的名称&#xff0c;我们把这种名称称之为标识符。 标识符划分&#xff1a…

mysql pmm 布署_给 mysql 安装 pmm 监控

PMM 说明PMM(Percona Monitoring and Management) 是一款监控和分析 MySQL 服务的一套工具&#xff0c;可以从图形化的方式看到 MySQL 服务的各种性能指标&#xff0c;慢查询分析、连接数、线程状态、查询信息、缓存信息等等&#xff0c;对分析 MySQL 运行时问题很有帮助。PMM …

java 自定义注解_Java注解

前言近日在阅读开源项目&#xff0c;发现项目里好多奇奇怪怪的注解(DataScope、Log...)看得我一脸懵&#xff0c;不知道大家是否也有过这样的经历&#xff0c;回想了一下&#xff0c;发现自己对于注解的知识&#xff0c;好像只停留在Override。。。异常尴尬&#xff0c;所以今天…

java开发和基于asp.net开发有什么优越性?_java语言的入门开始介绍

java编程语言是目前世界最流行的编程语言&#xff0c;它是在c的基础上开发出来的语言&#xff0c;它取其精华去其糟粕让java语言具有功能强大和简单易用的特征。java具有&#xff1a;面对对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。java可以编写…

响应性web设计实战总结(二)

响应性web设计实战总结(二) 阅读目录 背景知识&#xff1a;Gulp-less安装及配置如下对响应性web总结&#xff0c;之前总结过2篇文章&#xff1b;可以看如下&#xff1a; http://www.cnblogs.com/tugenhua0707/p/4147569.html http://www.cnblogs.com/tugenhua0707/p/4598657.h…

uploadify java 上传_jquery使用uploadify插件实现多文件的上传(java版)

2、安装&#xff0c;由于下载下来的例子是php版本的&#xff0c;所以我只留下了主要的几个文件。如图&#xff1a;4、使用前台页面&#xff1a;pageEncoding"UTF-8"%>html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR…

js 多个定时器_JS中的同步/异步编程

1. 进程(process)/线程(thread)进程process&#xff1a; 电脑端安装很多的应用软件&#xff0c;每当运行一个应用程序&#xff0c;相当于开辟一个进程&#xff08;而对于浏览器来说&#xff0c;每新建一个页卡访问一个页面&#xff0c;都是新开辟一个进程&#xff09;任务管理器…

Tomcat免安装版的环境变量配置以及Eclipse下的Tomcat配置和测试

Tomcat是目前比较流行的开源且免费的Web应用服务器&#xff0c;在我的电脑上第一次安装Tomcat&#xff0c;再经过网上教程和自己的摸索后&#xff0c;将这个过程 重新记录下来&#xff0c;以便以后如果忘记了可以随时查看。 注意&#xff1a;首先要明确一点&#xff0c;Tomcat与…

java开发和structs的关系_java---springMVC与strutsMVC的区别

项目刚刚换了web层框架&#xff0c;放弃了struts2改用spring3mvc当初还框架的时候目的比较单纯---springmvc支持rest&#xff0c;小生对restful url由衷的喜欢不用不知道 一用就发现开发效率确实比struts2高我们用struts2时采用的传统的配置文件的方式&#xff0c;并没有使用传…

【推荐】介绍两款Windows资源管理器,Q-Dir 与 FreeCommander XE(比TotalCommander更易用的免费资源管理器)...

你是否也像我一样&#xff0c;随着硬盘、文件数量的增加&#xff0c;而感到对于文件的管理越来越乏力。 于是我试用了传说中的各种软件&#xff0c;包括各种Explorer外壳&#xff0c;或者第三方资源管理器。 最后我确定下来经常使用&#xff0c;并推荐给您的是这两款软件&#…

java类加载器_java底层内功 第一章,类加载器的任性

java类是怎么加载的&#xff1f;类加载机制JVM主要包含三大核心部分&#xff1a;类加载器&#xff0c;运行时数据区和执行引擎。虚拟机将描述类的数据从class文件加载到内存&#xff0c;并对数据进行校验&#xff0c;准备&#xff0c;解析和初始化&#xff0c;最终就会形成可以…

java的requestmapping_SpringMVC RequestMapping 详解

SpringMVC RequestMapping 详解RequestMapping这个注解在SpringMVC扮演着非常重要的角色&#xff0c;可以说是随处可见。它的知识点很简单。今天我们就一起学习SpringMVC的RequestMapping这个注解。文章主要分为两个部分&#xff1a;RequestMapping 基础用法和RequestMapping 提…

redis查询所有key命令_想在生产搞事情?那试试这些 Redis 命令

作者&#xff1a;鸭血粉丝出自&#xff1a;Java极客技术原文&#xff1a;mp.weixin.qq.com/s/WeAamgYYGQfxlsppsn9_lg哎&#xff0c;最近阿粉又双叒叕犯事了。事情是这样的&#xff0c;前一段时间阿粉公司生产交易偶发报错&#xff0c;一番排查下来最终原因是因为 Redis 命令执…