import threading;
import queue;
import time;
import random;
zahlDerPhilos=9;
philoRange=range(zahlDerPhilos);
maxEssenszeit=5;
class EssStaebchenSteuerung(object):
def __init__(self):
self.StaebchenLock=threading.Lock();
class TischProtokoll(object):
def __init__(self,maxPhilos):
self.tischProtokollLock=threading.Semaphore(maxPhilos);
def nehmeTeil(self):
self.tischProtokollLock.acquire();
def nehmeAuszeit(self):
self.tischProtokollLock.release();
def statusEssen(id,essenszeit=1):
ausgabenWarteschlange.put(dauerStr(sZ)+'| P'+str(id)+' | | ESSEN' );
time.sleep(essenszeit);
def statusDenken(id,denkzeit=1):
ausgabenWarteschlange.put(dauerStr(sZ)+'| P'+str(id)+' | | DENKEN' );
time.sleep(denkzeit);
class Philos(threading.Thread):
def __init__(self,idNb,dZ=0,eZ=0):
threading.Thread.__init__(self);
self.Rundenzahl=0;
self.DenkZeit=dZ;
self.EssensZeit=eZ;
self.MeineId=idNb+1;
self.EssStaebchen1=idNb;
self.EssStaebchen2=(idNb+1)%zahlDerPhilos;
self.statusAcquire1=False;
self.statusAcquire2=False;
self.neuStart=False;
self.statusNehmeTeil=False;
def run(self):
warteZeit=3.5;
statusDenken(self.MeineId);
while (self.EssensZeit<maxEssenszeit):
self.Rundenzahl+=1;
info1='P'+str(self.MeineId)+' | E'+str(self.EssStaebchen1);
info2='P'+str(self.MeineId)+' | E'+str(self.EssStaebchen2);
unserTisch.nehmeTeil();
self.statusNehmeTeil=True;
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info1
+' | Eßstäbchen angefordert');
self.statusAcquire1=True;
statusAcquire=essStaebchen[self.EssStaebchen1].StaebchenLock.acquire(timeout=warteZeit);
if not statusAcquire:
self.statusAcquire1=False;
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info1
+' | Eßstäbchen NICHT erhalten - AUSSTIEG ###');
self.neuStart=True;
break;
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info1
+' | Eßstäbchen erhalten');
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info2
+' | Eßstäbchen angefordert');
self.statusAcquire2=True;
statusAcquire=essStaebchen[self.EssStaebchen2].StaebchenLock.acquire(timeout=warteZeit);
if not statusAcquire:
self.statusAcquire2=False;
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info2
+' | Eßstäbchen NICHT erhalten - AUSSTIEG ###');
self.neuStart=True;
break;
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info2
+' | Eßstäbchen erhalten');
essensZeit=random.uniform(0.85,1.15);
self.EssensZeit+=essensZeit;
statusEssen(self.MeineId,essensZeit);
numAusstieg=random.uniform(0.0,10.0);
if 0.0<=numAusstieg<=0.2:
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+'P'+str(self.MeineId)
+' | | AUSTIEG ###');
self.neuStart=True;
break;
essStaebchen[self.EssStaebchen1].StaebchenLock.release();
self.statusAcquire1=False;
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info1
+' | Eßstäbchen abgelegt');
essStaebchen[self.EssStaebchen2].StaebchenLock.release();
self.statusAcquire2=False;
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info2
+' | Eßstäbchen abgelegt');
unserTisch.nehmeAuszeit();
self.statusNehmeTeil=False;
denkZeit=random.uniform(0.85,1.15);
self.DenkZeit+=denkZeit;
statusDenken(self.MeineId,denkZeit);
if self.statusAcquire1:
essStaebchen[self.EssStaebchen1].StaebchenLock.release();
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info1
+' | Eßstäbchen am Ende abgelegt');
if self.statusAcquire2:
essStaebchen[self.EssStaebchen2].StaebchenLock.release();
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info2
+' | Eßstäbchen am Ende abgelegt');
if self.statusNehmeTeil:
unserTisch.nehmeAuszeit();
self.statusNehmeTeil=False;
ausgabe=(dauerStr(sZ)+'| P'+str(self.MeineId)
+' | | EZ'+fFormat(self.EssensZeit)
+'; DZ'+fFormat(self.DenkZeit));
ausgabenWarteschlange.put(ausgabe);
if self.neuStart:
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+'P'+str(self.MeineId)
+' | | NEUSTART §§§');
neuPhilo=Philos(self.MeineId-1,self.DenkZeit,self.EssensZeit);
neuePhilos.put(neuPhilo);
neuPhilo.start();
def fFormat(x):
return ' {0:.3f} '.format(x);
class AusgabenTasks(threading.Thread):
def __init__(self):
threading.Thread.__init__(self);
def run(self):
while True:
ausgabe=ausgabenWarteschlange.get();
if ausgabe=='0':
break;
print(ausgabe);
def fFormat4(x):
return ' {0:8.5f} '.format(x);
def dauerStr(start):
return fFormat4(time.clock()-start);
if __name__ == '__main__':
print('\n# Beginn ...');
if True:
essStaebchen=[];
for ix in philoRange:
ixStaebchen=EssStaebchenSteuerung();
essStaebchen.append(ixStaebchen);
unserTisch=TischProtokoll(zahlDerPhilos-1);
ausgabenWarteschlange=queue.Queue();
ausgabenTask=AusgabenTasks();
ausgabenTask.start();
neuePhilos=queue.Queue();
sZ=time.clock();
allePhilos=[];
for ix in philoRange:
philo=Philos(ix);
allePhilos.append(philo);
philo.start();
for philo in allePhilos:
philo.join();
if neuePhilos.qsize() > 0:
while not neuePhilos.empty():
philo=neuePhilos.get();
philo.join();
ausgabenWarteschlange.put('0');
ausgabenTask.join();
print('# Ende.\n');