哲学家就餐问题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,一经查实,立即删除!

相关文章

mongodb 库数量限制_MongoDB in 数量限制

1、查询语句本身其实是一个document&#xff0c; 最大为16MB(3.4&#xff0c;4.0 的限制&#xff0c;官方文档)2、查询语句本身&#xff0c;也就是{ : { $in : [] }}&#xff0c; 大小为 22字节3、每增加一个字段名&#xff0c;增加一位字节4、in里面每增加一个参数&#xff0…

Webx框架:Pipeline基本介绍

Pipeline。它是管道的含义。一个管道阀门可以安装非常多。有许多可能的分支。它是用来控制页处理。它需要在被定义pipeline.xml文件。该文件是为每个阀的标签。该文件可以放一些简单的控制语句。在项目。这条管线有以下配置足够好。 <services:pipeline xmlns"http://w…

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

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

python查找公共前缀_Python实现查找字符串数组最长公共前缀示例

本文实例讲述了Python实现查找字符串数组最长公共前缀。分享给大家供大家参考&#xff0c;具体如下&#xff1a;编写一个函数来查找字符串数组中的最长公共前缀。 class Solution:def longestCommonPrefix(self, strs):""":type strs: List[str]:rtype: str&quo…

博客搬家了

新博客&#xff1a;http://lindawhite.gq转载于:https://www.cnblogs.com/linda586586/p/4682027.html

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

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

mysql查询库表变更信息_PythonMySQL进行数据库表变更和查询

这篇文章主要介绍了Python MySQL进行数据库表变更和查询的相关资料,需要的朋友可以参考下Python连接MySQL&#xff0c;进行数据库表变更和查询&#xff1a;python mysql insert delete query&#xff1a;#!/usr/bin/pythonimport MySQLdbdef doInsert(cursor,db):#insert# Prep…

CSS实现不固定宽度和高度的自动居中

有时候我们需要实现下面这种效果&#xff1a;嘎嘎&#xff0c;撑大高度不让你剧中嘎嘎&#xff0c;撑大高度不让你剧中嘎嘎&#xff0c;撑大高度不让你剧中嘎嘎&#xff0c;撑大高度不让你剧中嘎嘎&#xff0c;撑大高度不让你剧中嘎嘎&#xff0c;撑大高度不让你剧中嘎嘎&#…

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…

Hbase Interface HConnection

HTablePool 在Hbase 0.94、0.95、0.97被废弃&#xff0c;在0.98中被清除&#xff08; HTablePool 对比HConnection.getTable&#xff09;&#xff0c;hbase0.98 HTablePool会被逐渐废弃&#xff0c;直到0.98的发行版本中会被清楚。使用新的API&#xff0c;HConnection.getTable…

让一个动画一直执行的属性是_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;所以今天…

JS 判断滚动底部并加载更多效果。。。。。。。。。

JS 判断滚动底部并加载更多效果。。。。。。。。。 <html lang"zh-cn"> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <title>js网页滚动条滚动事件 </title> <style type"…

mysql 格林时间转换_oracle中将格林威治时间转化为一般时间

下面是编程之家 jb51.cc 通过网络收集整理的代码片段。编程之家小编现在分享给大家&#xff0c;也给大家做个参考。to_char(trunc(b.starttime/1000/60/60/24)TO_DATE(1970-01-01 00:00:00,yyyy-MM-dd hh24:mi:ss),yyyy-mm-dd)|| ||lpad(mod(trunc(b.starttime/1000/60/60),24)…

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

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