import threading;
import queue;
import time;
import random;
zahlDerPhilos=9;
philoRange=range(zahlDerPhilos);
maxRundenZahl=5;
class EssStaebchenSteuerung(object):
def __init__(self):
self.staebchenLock=threading.Lock();
def nehmeStaebchenAuf(self):
self.staebchenLock.acquire();
def legeStaebchenAb(self):
self.staebchenLock.release();
def statusEssen(id,essenszeit):
ausgabenWarteschlange.put(dauerStr(sZ)+'| P'+str(id)+' | | ESSEN' );
time.sleep(essenszeit);
def statusDenken(id,denkzeit):
ausgabenWarteschlange.put(dauerStr(sZ)+'| P'+str(id)+' | | DENKEN' );
time.sleep(denkzeit);
class Philos(threading.Thread):
def __init__(self,idNb):
threading.Thread.__init__(self);
self.Rundenzahl=0;
self.DenkZeit=0;
self.EssensZeit=0;
self.MeineId=idNb+1;
self.EssStaebchen1=idNb;
self.EssStaebchen2=(idNb+1)%zahlDerPhilos;
def run(self):
denkZeit=1;
statusDenken(self.MeineId,denkZeit);
while (self.Rundenzahl<maxRundenZahl):
self.Rundenzahl+=1;
info1='P'+str(self.MeineId)+' | E'+str(self.EssStaebchen1);
info2='P'+str(self.MeineId)+' | E'+str(self.EssStaebchen2);
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info1
+' | Eßstäbchen AUF');
essStaebchen[self.EssStaebchen1].nehmeStaebchenAuf();
time.sleep(0.0001);
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info2
+' | Eßstäbchen AUF');
essStaebchen[self.EssStaebchen2].nehmeStaebchenAuf();
essensZeit=1;
self.EssensZeit+=essensZeit;
statusEssen(self.MeineId,essensZeit);
essStaebchen[self.EssStaebchen1].legeStaebchenAb();
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info1
+' | Eßstäbchen AB');
essStaebchen[self.EssStaebchen2].legeStaebchenAb();
ausgabenWarteschlange.put(dauerStr(sZ)+'| '
+info2
+' | Eßstäbchen AB');
denkZeit=1;
self.DenkZeit+=denkZeit;
statusDenken(self.MeineId,denkZeit);
ausgabe=(dauerStr(sZ)+'| P'+str(self.MeineId)
+' | | EZ: '+fFormat(self.EssensZeit)
+'; DZ: '+fFormat(self.DenkZeit));
ausgabenWarteschlange.put(ausgabe);
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:
essStaebchen.append(EssStaebchenSteuerung());
ausgabenWarteschlange=queue.Queue();
ausgabenTask=AusgabenTasks();
ausgabenTask.start();
sZ=time.clock();
allePhilos=[];
for ix in philoRange:
philo=Philos(ix);
allePhilos.append(philo);
philo.start();
for philo in allePhilos:
philo.join();
ausgabenWarteschlange.put('0');
ausgabenTask.join();
print('# Ende.\n');