哲学家就餐问题:
哲学家就餐问题是典型的同步问题,该问题描述的是五个哲学家共用一张圆桌,分别坐在五张椅子上,在圆桌上有五个盘子和五个叉子(如下图),他们的生活方式是交替的进行思考和进餐,思考时不能用餐,用餐时不能思考。平时,一个哲学家进行思考,饥饿时便试图用餐,只有在他同时拿到他的盘子左右两边的两个叉子时才能进餐。进餐完毕后,他会放下叉子继续思考。请写出代码来解决如上的哲学家就餐问题,要求代码返回“当每个哲学家分别需要进食 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哲学家就餐
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 羽泉《给未来的你&天黑天亮》[WAV+CUE][968M]
- 庄心妍《我也许在等候》[低速原抓WAV+CUE]
- 王雅洁《小调歌后2》[原抓WAV+CUE]
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]