哲学家就餐问题:

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

测试用例:

输入: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

哲学家就餐问题python_Python实现哲学家就餐问题实例代码相关推荐

  1. 【操作系统】请写出最多允许4人同时进餐的哲学家进餐问题的算法(视频中的代码有点错误)

    题目 请写出最多允许4人同时进餐的哲学家进餐问题的算法(视频中的代码有点错误) 答案 代码 Var chopstick:array[0,-,4],limit : semaphore:=1,1,1,1, ...

  2. 哲学家就餐问题php代码,Python实现哲学家就餐问题实例代码

    哲学家就餐问题: 哲学家就餐问题是典型的同步问题,该问题描述的是五个哲学家共用一张圆桌,分别坐在五张椅子上,在圆桌上有五个盘子和五个叉子(如下图),他们的生活方式是交替的进行思考和进餐,思考时不能用餐 ...

  3. 与计算机相关的哲学家,数:计算机、哲学家及对数的含义的探索

    数:计算机.哲学家及对数的含义的探索 出 版 社:商务印书馆 丛 书:数学之旅丛书 出版时间:2008年03月 定 价:15.00 I S B N :9787100055772 所属分类: 科学与自然 ...

  4. 顶级科学家是哲学家,顶级investor是哲学家

    在人类发展历史进程中的某一个点上,出现了一个爱因斯坦式的科学家,给出了一个宏观微观连接的理论体系,被称作一个伟大的偶然. 在经济与金融投资的世界里,巴菲特老爷爷说道,宏观的是我们必需接受的,微观才是我 ...

  5. ddos攻击python_Python基于http的ddos攻击代码

    基于http的ddos,主要就是靠占用连接数达到攻击目标,但也非常危险,会暴露攻击者的ip,慎用 #!/usr/bin/env python import socket import time imp ...

  6. 有效括号 python_python 有效的括号的实现代码示例

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认 ...

  7. integrate函数python_python scipy integrate.odeint用法及代码示例

    整合常微分方程组. 使用FORTRAN库odepack中的lsoda求解常微分方程组. 解决一阶ode-s的刚性或非刚性系统的初值问题: dy/dt = func(y, t, ...) [or fun ...

  8. .nii格式文件python_python 读取.nii格式图像实例

    我就废话不多说了,大家还是直接看代码吧~ # encoding=utf8 ''' 查看和显示nii文件 ''' import matplotlib matplotlib.use('TkAgg') fr ...

  9. 五人分鱼python_Python经典五人分鱼代码实例解析

    本篇文章小编给大家分享一下Python经典五人分鱼代码实例解析,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. A.B.C.D.E 五人在某天夜里合伙去 ...

最新文章

  1. 数据库连接python_python连接数据库
  2. 如何关闭mac烦人的更新升级提醒
  3. python 发送邮件不显示附件_求助:写python脚本发 带有附件的邮件, 收到邮件后,发现附件直接显示在屏幕上了,而不是以附件形式...
  4. Java 使用阿里云短信的API接口
  5. atos命令符化号crash文件
  6. Linux GPIO键盘驱动开发记录_OMAPL138
  7. 一.hadoop入门须知
  8. NetApp S550:做“小”的艺术
  9. picGo图片上传到码云失败,报错404-{“message”:“Branch”}的解决方法
  10. matlab读取scv文件,matlab如何读取csv文件
  11. JavaScript函数——输入某年某月某日,判断这一天是一年中的第几天
  12. 中断上下文中的preempt count
  13. 欧几里德算法(Euclidean algorithm)
  14. iphone怎么连接itunes相关解锁教程
  15. LPC1768PWM实验
  16. C语言 文件合成器代码(用图片掩盖.rar文件)
  17. horizon云桌面管理功能说明
  18. Barbalat引理与类李雅普诺夫引理,及它们在自适应控制系统设计的应用
  19. Orcal ETL 增量抽取--ORA_ROWSCN伪列
  20. Kernel Knights (Gym - 101480K)

热门文章

  1. java栈API_Java中的堆栈API——Stack
  2. git 大文件报错Out of memory, malloc failed、 The remote end hung up unexpectedly
  3. CDH集群异常处理ERROR  Failure due to stall on seeded torrent.、重装时hdfs提示目录已存在、CDH重启不正常
  4. mac 删除php56 安装php72,mac php56升级php70
  5. 单元素枚举类实现单例模式
  6. .Net 中的继承知识点
  7. 基于mxnet的Regression问题Kaggle比赛代码框架
  8. zookeeper思维导图
  9. 037-PHP如何返回闭包函数实例
  10. 死磕 java同步系列之开篇