Az étkező filozófusok problémája egy klasszikus szinkronizációs probléma, amelyet Edsger Dijkstra vezetett be a párhuzamos programozás kihívásainak modellezésére. A probléma öt filozófust képzel el, akik körben ülnek egy asztal körül. Minden filozófus váltakozva gondolkodik és eszik, de az evéshez két szomszédos villára van szüksége. A probléma célja annak biztosítása, hogy a filozófusok ne kerüljenek holtpontba vagy éhezzenek.
A megoldáshoz szinkronizációs mechanizmusokat, például mutexeket és semaphore-okat használhatunk. Pythonban a threading
modul lehetőséget biztosít a párhuzamos szálak szinkronizálására.
Az alábbi megoldás a filozófusok viselkedését modellezi egy párhuzamos szálakra bontott programmal. Minden filozófus saját szálként fut, és a villák (mint megosztott erőforrások) threading.Lock
segítségével kerülnek szinkronizálásra.
import threading
import time
import random
class Philosopher(threading.Thread):
def __init__(self, name, left_fork, right_fork):
super().__init__()
self.name = name
self.left_fork = left_fork
self.right_fork = right_fork
def think(self):
print(f"{self.name} gondolkodik...")
time.sleep(random.uniform(1, 3))
def eat(self):
print(f"{self.name} eszik...")
time.sleep(random.uniform(1, 3))
print(f"{self.name} befejezte az evést.")
def run(self):
while True:
self.think()
print(f"{self.name} megpróbálja felvenni a bal villát.")
with self.left_fork:
print(f"{self.name} felvette a bal villát. Most megpróbálja felvenni a jobb villát.")
with self.right_fork:
print(f"{self.name} mindkét villát felvette. Most eszik.")
self.eat()
def main():
# Villák (megosztott erőforrások)
forks =
# Filozófusok
philosophers = [
Philosopher(f"Filozófus {i+1}", forks, forks)
for i in range(5)
]
# Filozófusok indítása
for philosopher in philosophers:
philosopher.start()
# Futtatás végtelenségig
for philosopher in philosophers:
philosopher.join()
if __name__ == "__main__":
main()
threading.Lock
segítségével kerülnek zárolásra, így egyszerre csak egy filozófus használhatja őket.with
utasítás, amely biztosítja, hogy egy filozófus mindkét villát egyszerre szerezze meg.time.sleep
szimulálja a gondolkodás és evés időtartamát.
Filozófus 1 gondolkodik... Filozófus 2 gondolkodik... Filozófus 3 gondolkodik... Filozófus 4 gondolkodik... Filozófus 5 gondolkodik... Filozófus 1 megpróbálja felvenni a bal villát. Filozófus 1 felvette a bal villát. Most megpróbálja felvenni a jobb villát. Filozófus 1 mindkét villát felvette. Most eszik. Filozófus 3 megpróbálja felvenni a bal villát. Filozófus 3 felvette a bal villát. Most megpróbálja felvenni a jobb villát. Filozófus 3 mindkét villát felvette. Most eszik. ...
semaphore
használatával, amely biztosítja, hogy legfeljebb (n-1) filozófus próbáljon egyszerre villát szerezni.
Az étkező filozófusok problémája remek példa a párhuzamos programozásban felmerülő szinkronizációs problémákra. A Python threading
modulja egyszerűen lehetővé teszi a szálak közötti erőforrás-megosztás kezelését. Ez a megoldás alapvetően biztonságos és hatékony módot biztosít a probléma modellezésére.