哲学家就餐问题:

哲学家就餐问题是典型的同步问题,该问题描述的是五个哲学家共用一张圆桌,分别坐在五张椅子上,在圆桌上有五个盘子和五个叉子(如下图),他们的生活方式是交替的进行思考和进餐,思考时不能用餐,用餐时不能思考。平时,一个哲学家进行思考,饥饿时便试图用餐,只有在他同时拿到他的盘子左右两边的两个叉子时才能进餐。进餐完毕后,他会放下叉子继续思考。请写出代码来解决如上的哲学家就餐问题,要求代码返回“当每个哲学家分别需要进食 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博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持python博客!

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

  1. 在哪里能收到python实例代码-python下10个简单实例代码

    注意:我用的python2.7,大家如果用Python3.0以上的版本,请记得在print()函数哦!如果因为版本问题评论的,不做回复哦!!! 1.题目:有1.2.3.4个数字,能组成多少个互不相同且 ...

  2. python七段数码管设计图案-Python绘制七段数码管实例代码

    七段数码管(seven-segmentindicator)由7段数码管拼接而成,每段有亮或不亮两种情况,改进型的七段数码管还包括一个小数点位置 绘制模式: input:输入当前日期的数字形式 proc ...

  3. python简单代码编写-python读写Excel表格的实例代码(简单实用)

    安装两个库:pip install xlrd.pip install xlwt 1.python读excel――xlrd 2.python写excel――xlwt 1.读excel数据,包括日期等数据 ...

  4. python读取excel表格-python读写Excel表格的实例代码(简单实用)

    安装两个库:pip install xlrd.pip install xlwt 1.python读excel--xlrd 2.python写excel--xlwt 1.读excel数据,包括日期等数据 ...

  5. python编程实例视屏-使用Python实现视频下载功能实例代码

    最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容.如果有一个程序可以把各大视频网站的热门用户最新发布的视频下载下来,不仅方便了观看,还可以将没有版权的视频发布在个人社交网站上,增加自 ...

  6. python画图代码七彩蟒蛇-Python实现七彩蟒蛇绘制实例代码

    本文主要研究的是Python编程turtle的实例,绘制一个七彩蟒蛇..具体如下. 第2周的课后练习里,有一道题目,要求修改"蟒蛇绘制"程序,对Python 蟒蛇的每个部分采用不同 ...

  7. python画轨迹曲线-python 自动轨迹绘制的实例代码

    用到的思维: 自动化思维,数据和功能分开处理,用数据驱动程序自动运行 接口化设计,数据与程序的对接方式要清晰明了 二维数据应用,应用维度组织数据,二维数据最常用 代码 # AutoTrace.py i ...

  8. python处理excel表格实例-使用Python操作excel文件的实例代码

    使用的类库 pip install openpyxl 操作实现 •工作簿操作 # coding: utf-8 from openpyxl import Workbook # 创建一个excel工作簿 ...

  9. python输出变量代码_Python中变量的输入输出实例代码详解

    1.变量的输入: input函数: input() input("请输入银行卡密码") password = input("请输入银行卡密码") 变量名 = i ...

  10. python扫雷的代码及原理_基于Python实现的扫雷游戏实例代码

    摘要:这篇Python开发技术栏目下的"基于Python实现的扫雷游戏实例代码",介绍的技术点是"Python实现.Python.实例代码.扫雷游戏.扫雷.游戏" ...

最新文章

  1. 并行程序设计报告(MPI并行计算π,实现mandelbrot集)
  2. 1-jQuery - AJAX load() 方法【基础篇】
  3. 双11还是那个双11,双12却早已不是那个双12
  4. 卧槽,别人家的黑客增长!
  5. Git(9)-diff
  6. consul代理---健康检测
  7. 基于容器服务的持续集成与云端交付(四)- 多种发布方式
  8. 推荐3款简约好用录屏工具
  9. 我与WCF有个约会之牵手篇-第一个WCF示例程序
  10. 最全 MySQL 优化方法,从此优化不再难
  11. Python使用xpath爬取51job
  12. 浅析城市道路照明的安全及节电设备的应用
  13. Rasa课程、Rasa培训、Rasa面试系列 金融银行案例Bot Step By Step学习
  14. 电脑键盘功能基础知识,快速入门,抓住这份详细教程
  15. 【虹科】人工智能和工业相机助力瓶盖质量控制
  16. 推荐!国外程序员整理的Java资源大全
  17. 【GPT4】微软 GPT-4 测试报告(6)与人类的交互能力
  18. Servlet初识了解和应用
  19. 【用PS3手柄在安卓设备上玩游戏系列】连接手柄和设备
  20. 黑马程序员C++ 案例四 机房预约系统

热门文章

  1. 1854: zbj的可乐(思维题)
  2. 云原生演进趋势下传统数据库升级实践
  3. 【深度探讨】阿里巴巴万级规模 K8s 集群全局高可用体系之美
  4. 执行python时,ImportError: No module named xxx的解决方法
  5. 腾讯天美六位TA:技术美术这份职业会长期存在吗?
  6. 数字雕刻中“节奏”的作用
  7. Debug经验总结:优化、程序员和概率
  8. 游戏AI研究(三):路径规划
  9. 如何让手游内存占用更小?从内存消耗iOS实时统计开始
  10. linux 下修改最大文件数