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();
# end class


def statusEssen(id,essenszeit):
   ausgabenWarteschlange.put(dauerStr(sZ)+'| P'+str(id)+' |    | ESSEN' );
   time.sleep(essenszeit);
# end def

def statusDenken(id,denkzeit):
   ausgabenWarteschlange.put(dauerStr(sZ)+'| P'+str(id)+' |    | DENKEN' );
   time.sleep(denkzeit);
# end def


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;
   # end def

   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); ### 0.0001

           ausgabenWarteschlange.put(dauerStr(sZ)+'| '
                                     +info2
                                     +' | Eßstäbchen AUF');
           essStaebchen[self.EssStaebchen2].nehmeStaebchenAuf();

           essensZeit=1;
           self.EssensZeit+=essensZeit;
           statusEssen(self.MeineId,essensZeit);
           
           #release
           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);
       # end while
       
       ausgabe=(dauerStr(sZ)+'| P'+str(self.MeineId)
                    +' |    | EZ: '+fFormat(self.EssensZeit)
                    +'; DZ: '+fFormat(self.DenkZeit));
       ausgabenWarteschlange.put(ausgabe);
   # end def

# end class


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);
       # end while
   # end def
# end class


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();
       # end for

       for philo in allePhilos:
           philo.join();

       ausgabenWarteschlange.put('0');
       ausgabenTask.join();
   # end if

#------------------------------------------------------------------------------#
   print('# Ende.\n');
# end if main

#------------------------------------------------------------------------------#



##    >>> ================================ RESTART ================================
##    >>>
##
##    # Beginn ...
##     0.00046 | P1 |    | DENKEN
##     0.00141 | P2 |    | DENKEN
##     0.00197 | P3 |    | DENKEN
##     0.00241 | P4 |    | DENKEN
##     0.00284 | P5 |    | DENKEN
##     0.00330 | P6 |    | DENKEN
##     0.00382 | P7 |    | DENKEN
##     0.00428 | P8 |    | DENKEN
##     0.00473 | P9 |    | DENKEN
##     1.00335 | P1 | E0 | Eßstäbchen AUF
##     1.00348 | P1 | E1 | Eßstäbchen AUF
##     1.00353 | P1 |    | ESSEN
##     1.00369 | P6 | E5 | Eßstäbchen AUF
##     1.00376 | P6 | E6 | Eßstäbchen AUF
##     1.00380 | P6 |    | ESSEN
##     1.00395 | P2 | E1 | Eßstäbchen AUF
##     1.00414 | P5 | E4 | Eßstäbchen AUF
##     1.00421 | P5 | E5 | Eßstäbchen AUF
##     1.00436 | P7 | E6 | Eßstäbchen AUF
##     1.00455 | P3 | E2 | Eßstäbchen AUF
##     1.00462 | P3 | E3 | Eßstäbchen AUF
##     1.00466 | P3 |    | ESSEN
##     1.00482 | P4 | E3 | Eßstäbchen AUF
##     1.00500 | P8 | E7 | Eßstäbchen AUF
##     1.00507 | P8 | E8 | Eßstäbchen AUF
##     1.00511 | P8 |    | ESSEN
##     2.01729 | P1 | E0 | Eßstäbchen AB
##     2.01743 | P1 | E1 | Eßstäbchen AB
##     2.01750 | P1 |    | DENKEN
##     2.01759 | P3 | E2 | Eßstäbchen AB
##     2.01768 | P3 | E3 | Eßstäbchen AB
##     2.01774 | P3 |    | DENKEN
##     2.01785 | P8 | E7 | Eßstäbchen AB
##     2.01794 | P8 | E8 | Eßstäbchen AB
##     2.01799 | P8 |    | DENKEN
##     2.01811 | P6 | E5 | Eßstäbchen AB
##     2.01821 | P6 | E6 | Eßstäbchen AB
##     2.01827 | P6 |    | DENKEN
##     2.01837 | P2 | E2 | Eßstäbchen AUF
##     2.01847 | P2 |    | ESSEN
##     2.01898 | P9 | E8 | Eßstäbchen AUF
##     2.01906 | P9 | E0 | Eßstäbchen AUF
##     2.01910 | P9 |    | ESSEN
##     2.01916 | P5 |    | ESSEN
##     2.01928 | P4 | E4 | Eßstäbchen AUF
##     2.01933 | P7 | E7 | Eßstäbchen AUF
##     2.01937 | P7 |    | ESSEN
##     3.03131 | P6 | E5 | Eßstäbchen AUF
##     3.03144 | P3 | E2 | Eßstäbchen AUF
##     3.03160 | P8 | E7 | Eßstäbchen AUF
##     3.03174 | P7 | E6 | Eßstäbchen AB
##     3.03184 | P7 | E7 | Eßstäbchen AB
##     3.03190 | P7 |    | DENKEN
##     3.03205 | P1 | E0 | Eßstäbchen AUF
##     3.03220 | P2 | E1 | Eßstäbchen AB
##     3.03229 | P2 | E2 | Eßstäbchen AB
##     3.03235 | P2 |    | DENKEN
##     3.03243 | P9 | E8 | Eßstäbchen AB
##     3.03253 | P9 | E0 | Eßstäbchen AB
##     3.03259 | P9 |    | DENKEN
##     3.03266 | P5 | E4 | Eßstäbchen AB
##     3.03273 | P5 | E5 | Eßstäbchen AB
##     3.03278 | P5 |    | DENKEN
##     3.03283 | P6 | E6 | Eßstäbchen AUF
##     3.03287 | P6 |    | ESSEN
##     3.03297 | P4 |    | ESSEN
##     3.03307 | P3 | E3 | Eßstäbchen AUF
##     3.03320 | P1 | E1 | Eßstäbchen AUF
##     3.03329 | P1 |    | ESSEN
##     3.03375 | P8 | E8 | Eßstäbchen AUF
##     3.03389 | P8 |    | ESSEN
##     4.04527 | P9 | E8 | Eßstäbchen AUF
##     4.04539 | P4 | E3 | Eßstäbchen AB
##     4.04544 | P4 | E4 | Eßstäbchen AB
##     4.04549 | P4 |    | DENKEN
##     4.04564 | P7 | E6 | Eßstäbchen AUF
##     4.04579 | P8 | E7 | Eßstäbchen AB
##     4.04588 | P8 | E8 | Eßstäbchen AB
##     4.04594 | P8 |    | DENKEN
##     4.04605 | P1 | E0 | Eßstäbchen AB
##     4.04614 | P1 | E1 | Eßstäbchen AB
##     4.04619 | P1 |    | DENKEN
##     4.04635 | P2 | E1 | Eßstäbchen AUF
##     4.04642 | P2 | E2 | Eßstäbchen AUF
##     4.04658 | P5 | E4 | Eßstäbchen AUF
##     4.04665 | P5 | E5 | Eßstäbchen AUF
##     4.04676 | P6 | E5 | Eßstäbchen AB
##     4.04686 | P6 | E6 | Eßstäbchen AB
##     4.04692 | P6 |    | DENKEN
##     4.04738 | P3 |    | ESSEN
##     4.04750 | P9 | E0 | Eßstäbchen AUF
##     4.04754 | P9 |    | ESSEN
##     4.04759 | P5 |    | ESSEN
##     4.04771 | P7 | E7 | Eßstäbchen AUF
##     4.04776 | P7 |    | ESSEN
##     5.05924 | P1 | E0 | Eßstäbchen AUF
##     5.05936 | P7 | E6 | Eßstäbchen AB
##     5.05940 | P7 | E7 | Eßstäbchen AB
##     5.05945 | P7 |    | DENKEN
##     5.05957 | P3 | E2 | Eßstäbchen AB
##     5.05966 | P3 | E3 | Eßstäbchen AB
##     5.05972 | P3 |    | DENKEN
##     5.05987 | P8 | E7 | Eßstäbchen AUF
##     5.05994 | P8 | E8 | Eßstäbchen AUF
##     5.06010 | P4 | E3 | Eßstäbchen AUF
##     5.06017 | P4 | E4 | Eßstäbchen AUF
##     5.06028 | P5 | E4 | Eßstäbchen AB
##     5.06037 | P5 | E5 | Eßstäbchen AB
##     5.06043 | P5 |    | DENKEN
##     5.06055 | P9 | E8 | Eßstäbchen AB
##     5.06064 | P9 | E0 | Eßstäbchen AB
##     5.06070 | P9 |    | DENKEN
##     5.06085 | P6 | E5 | Eßstäbchen AUF
##     5.06092 | P6 | E6 | Eßstäbchen AUF
##     5.06096 | P6 |    | ESSEN
##     5.06142 | P2 |    | ESSEN
##     5.06162 | P1 | E1 | Eßstäbchen AUF
##     5.06168 | P4 |    | ESSEN
##     5.06173 | P8 |    | ESSEN
##     6.07324 | P9 | E8 | Eßstäbchen AUF
##     6.07345 | P5 | E4 | Eßstäbchen AUF
##     6.07404 | P3 | E2 | Eßstäbchen AUF
##     6.07427 | P6 | E5 | Eßstäbchen AB
##     6.07431 | P6 | E6 | Eßstäbchen AB
##     6.07437 | P6 |    | DENKEN
##     6.07443 | P2 | E1 | Eßstäbchen AB
##     6.07447 | P2 | E2 | Eßstäbchen AB
##     6.07452 | P2 |    | DENKEN
##     6.07456 | P1 |    | ESSEN
##     6.07461 | P4 | E3 | Eßstäbchen AB
##     6.07464 | P4 | E4 | Eßstäbchen AB
##     6.07469 | P4 |    | DENKEN
##     6.07473 | P5 | E5 | Eßstäbchen AUF
##     6.07477 | P5 |    | ESSEN
##     6.07481 | P8 | E7 | Eßstäbchen AB
##     6.07485 | P8 | E8 | Eßstäbchen AB
##     6.07489 | P8 |    | DENKEN
##     6.07493 | P9 | E0 | Eßstäbchen AUF
##     6.07499 | P7 | E6 | Eßstäbchen AUF
##     6.07503 | P7 | E7 | Eßstäbchen AUF
##     6.07506 | P7 |    | ESSEN
##     6.07510 | P3 | E3 | Eßstäbchen AUF
##     6.07514 | P3 |    | ESSEN
##     7.08725 | P6 | E5 | Eßstäbchen AUF
##     7.08743 | P4 | E3 | Eßstäbchen AUF
##     7.08762 | P8 | E7 | Eßstäbchen AUF
##     7.08776 | P7 | E6 | Eßstäbchen AB
##     7.08786 | P7 | E7 | Eßstäbchen AB
##     7.08791 | P7 |    | DENKEN
##     7.08803 | P3 | E2 | Eßstäbchen AB
##     7.08812 | P3 | E3 | Eßstäbchen AB
##     7.08818 | P3 |    | DENKEN
##     7.08833 | P2 | E1 | Eßstäbchen AUF
##     7.08848 | P1 | E0 | Eßstäbchen AB
##     7.08858 | P1 | E1 | Eßstäbchen AB
##     7.08863 | P1 |    | DENKEN
##     7.08874 | P5 | E4 | Eßstäbchen AB
##     7.08884 | P5 | E5 | Eßstäbchen AB
##     7.08890 | P5 |    | DENKEN
##     7.08934 | P8 | E8 | Eßstäbchen AUF
##     7.08948 | P9 |    | ESSEN
##     7.08956 | P2 | E2 | Eßstäbchen AUF
##     7.08960 | P2 |    | ESSEN
##     7.08965 | P6 | E6 | Eßstäbchen AUF
##     7.08968 | P6 |    | ESSEN
##     7.08973 | P4 | E4 | Eßstäbchen AUF
##     7.08976 | P4 |    | ESSEN
##     8.10121 | P7 | E6 | Eßstäbchen AUF
##     8.10136 | P5 | E4 | Eßstäbchen AUF
##     8.10151 | P1 | E0 | Eßstäbchen AUF
##     8.10166 | P9 | E8 | Eßstäbchen AB
##     8.10176 | P9 | E0 | Eßstäbchen AB
##     8.10181 | P9 |    | DENKEN
##     8.10193 | P2 | E1 | Eßstäbchen AB
##     8.10201 | P2 | E2 | Eßstäbchen AB
##     8.10207 | P2 |    | DENKEN
##     8.10219 | P6 | E5 | Eßstäbchen AB
##     8.10228 | P6 | E6 | Eßstäbchen AB
##     8.10234 | P6 |    | DENKEN
##     8.10249 | P3 | E2 | Eßstäbchen AUF
##     8.10256 | P3 | E3 | Eßstäbchen AUF
##     8.10268 | P4 | E3 | Eßstäbchen AB
##     8.10277 | P4 | E4 | Eßstäbchen AB
##     8.10283 | P4 |    | DENKEN
##     8.10327 | P8 |    | ESSEN
##     8.10341 | P7 | E7 | Eßstäbchen AUF
##     8.10348 | P3 |    | ESSEN
##     8.10353 | P5 | E5 | Eßstäbchen AUF
##     8.10357 | P5 |    | ESSEN
##     8.10367 | P1 | E1 | Eßstäbchen AUF
##     8.10371 | P1 |    | ESSEN
##     9.11521 | P9 | E8 | Eßstäbchen AUF
##     9.11535 | P4 | E3 | Eßstäbchen AUF
##     9.11547 | P8 | E7 | Eßstäbchen AB
##     9.11556 | P8 | E8 | Eßstäbchen AB
##     9.11562 | P8 |    | DENKEN
##     9.11573 | P3 | E2 | Eßstäbchen AB
##     9.11583 | P3 | E3 | Eßstäbchen AB
##     9.11588 | P3 |    | DENKEN
##     9.11604 | P6 | E5 | Eßstäbchen AUF
##     9.11623 | P2 | E1 | Eßstäbchen AUF
##     9.11637 | P5 | E4 | Eßstäbchen AB
##     9.11646 | P5 | E5 | Eßstäbchen AB
##     9.11652 | P5 |    | DENKEN
##     9.11663 | P1 | E0 | Eßstäbchen AB
##     9.11673 | P1 | E1 | Eßstäbchen AB
##     9.11678 | P1 |    | DENKEN
##     9.11724 | P9 | E0 | Eßstäbchen AUF
##     9.11735 | P9 |    | ESSEN
##     9.11746 | P4 | E4 | Eßstäbchen AUF
##     9.11755 | P4 |    | ESSEN
##     9.11766 | P6 | E6 | Eßstäbchen AUF
##     9.11779 | P2 | E2 | Eßstäbchen AUF
##     9.11785 | P2 |    | ESSEN
##     9.11793 | P7 |    | ESSEN
##     10.12917 | P8 | E7 | Eßstäbchen AUF
##     10.12969 | P1 | E0 | Eßstäbchen AUF
##     10.12984 | P9 | E8 | Eßstäbchen AB
##     10.12993 | P9 | E0 | Eßstäbchen AB
##     10.12999 | P9 |    | DENKEN
##     10.13015 | P5 | E4 | Eßstäbchen AUF
##     10.13029 | P4 | E3 | Eßstäbchen AB
##     10.13038 | P4 | E4 | Eßstäbchen AB
##     10.13044 | P4 |    | DENKEN
##     10.13060 | P3 | E2 | Eßstäbchen AUF
##     10.13075 | P7 | E6 | Eßstäbchen AB
##     10.13084 | P7 | E7 | Eßstäbchen AB
##     10.13090 | P7 |    | DENKEN
##     10.13101 | P2 | E1 | Eßstäbchen AB
##     10.13110 | P2 | E2 | Eßstäbchen AB
##     10.13116 | P2 |    | DENKEN
##     10.13140 | P1 | E1 | Eßstäbchen AUF
##     10.13150 | P1 |    | ESSEN
##     10.13161 | P5 | E5 | Eßstäbchen AUF
##     10.13177 | P6 |    | ESSEN
##     10.13193 | P8 | E8 | Eßstäbchen AUF
##     10.13202 | P8 |    | ESSEN
##     10.13214 | P3 | E3 | Eßstäbchen AUF
##     10.13219 | P3 |    | ESSEN
##     11.14310 | P4 | E3 | Eßstäbchen AUF
##     11.14325 | P9 | E8 | Eßstäbchen AUF
##     11.14336 | P6 | E5 | Eßstäbchen AB
##     11.14345 | P6 | E6 | Eßstäbchen AB
##     11.14351 | P6 |    | DENKEN
##     11.14362 | P1 | E0 | Eßstäbchen AB
##     11.14371 | P1 | E1 | Eßstäbchen AB
##     11.14376 | P1 |    | DENKEN
##     11.14392 | P2 | E1 | Eßstäbchen AUF
##     11.14399 | P2 | E2 | Eßstäbchen AUF
##     11.14415 | P7 | E6 | Eßstäbchen AUF
##     11.14422 | P7 | E7 | Eßstäbchen AUF
##     11.14433 | P8 | E7 | Eßstäbchen AB
##     11.14443 | P8 | E8 | Eßstäbchen AB
##     11.14448 | P8 |    | DENKEN
##     11.14460 | P3 | E2 | Eßstäbchen AB
##     11.14469 | P3 | E3 | Eßstäbchen AB
##     11.14475 | P3 |    | DENKEN
##     11.14520 | P7 |    | ESSEN
##     11.14537 | P9 | E0 | Eßstäbchen AUF
##     11.14546 | P9 |    | ESSEN
##     11.14558 | P2 |    | ESSEN
##     11.14574 | P4 | E4 | Eßstäbchen AUF
##     11.14590 | P5 |    | ESSEN
##     12.15701 | P1 |    | EZ:  5.000 ; DZ:  5.000
##     12.15726 | P9 | E8 | Eßstäbchen AB
##     12.15731 | P9 | E0 | Eßstäbchen AB
##     12.15737 | P9 |    | DENKEN
##     12.15785 | P3 |    | EZ:  5.000 ; DZ:  5.000
##     12.15825 | P2 | E1 | Eßstäbchen AB
##     12.15831 | P2 | E2 | Eßstäbchen AB
##     12.15836 | P2 |    | DENKEN
##     12.15841 | P5 | E4 | Eßstäbchen AB
##     12.15845 | P5 | E5 | Eßstäbchen AB
##     12.15850 | P5 |    | DENKEN
##     12.15854 | P6 |    | EZ:  5.000 ; DZ:  5.000
##     12.15880 | P7 | E6 | Eßstäbchen AB
##     12.15885 | P7 | E7 | Eßstäbchen AB
##     12.15890 | P7 |    | DENKEN
##     12.15894 | P8 |    | EZ:  5.000 ; DZ:  5.000
##     12.15910 | P4 |    | ESSEN
##     13.17097 | P9 |    | EZ:  5.000 ; DZ:  5.000
##     13.17153 | P2 |    | EZ:  5.000 ; DZ:  5.000
##     13.17185 | P5 |    | EZ:  5.000 ; DZ:  5.000
##     13.17210 | P7 |    | EZ:  5.000 ; DZ:  5.000
##     13.17227 | P4 | E3 | Eßstäbchen AB
##     13.17232 | P4 | E4 | Eßstäbchen AB
##     13.17238 | P4 |    | DENKEN
##     14.18519 | P4 |    | EZ:  5.000 ; DZ:  5.000
##    # Ende.
##
##    >>>