Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.24 KB | None | 0 0
  1. import random
  2. from sys import *
  3. import time
  4. from multiprocessing import Process, Pipe
  5.  
  6.  
  7.  
  8. def filozof(cjevovodi, index, N):
  9. print("Filozof " + str(index) + " sudjeluje na konferenciji.")
  10. time.sleep(1)
  11. primljeniOdgovori = 0
  12. logickiSat = random.randrange(N*N)
  13. redZahtjeva = []
  14. pocetniLogickiSat = logickiSat
  15.  
  16. print ("Filozof " + str(index) + " salje zahtjev za ulazak u KO")
  17. #stavi u svoj red zahtjev
  18.  
  19. zahtjev = (ZAHTJEV, index, pocetniLogickiSat)
  20. redZahtjeva.append(zahtjev)
  21.  
  22. for i in range(N):
  23. if i == index:
  24. continue
  25. cjevovodi[i][1].send(zahtjev)
  26.  
  27. while(True):
  28.  
  29. (tip, proces, sat) = cjevovodi[index][0].recv(); #blokira dok se nesto ne primi
  30. #print("Primljena poruka: " + tip + " u procesu " + str(index) +" od procesa " + str(proces))
  31. if(tip == ZAHTJEV):
  32. redZahtjeva.append((tip, proces, sat))
  33. sorted(redZahtjeva, key=lambda x: x[2])
  34. (tip, proces, sat) = redZahtjeva[0]
  35. if(tip == IZLAZAK):
  36. #ukloni iz reda
  37. #sorted(redZahtjeva, key=lambda x: x[2])
  38. #sortiraj svoju listu i ukloni prvi
  39. #redZahtjeva.pop()
  40. redZahtjeva.remove((ZAHTJEV, proces, sat))
  41. continue
  42.  
  43. if(tip == ZAHTJEV):
  44. #uskladi sat i stavi u red zahtjeva
  45. pocetniLogickiSat = max(pocetniLogickiSat, sat) + 1
  46. redZahtjeva.append((tip, proces, sat))
  47. #salji odgovor s novim satom
  48. cjevovodi[proces][1].send((ODGOVOR, index, pocetniLogickiSat))
  49. continue
  50.  
  51. #if (tip != ODGOVOR or proces != index):
  52. # continue
  53.  
  54. primljeniOdgovori = primljeniOdgovori + 1
  55.  
  56. if(primljeniOdgovori == N-1):
  57. sorted(redZahtjeva, key=lambda x: x[2])
  58. #print(redZahtjeva)
  59. (tip, proces, sat) = redZahtjeva[len(redZahtjeva)-1]
  60.  
  61. #prviZahtjevIndex = [x[0] for x in redZahtjeva]
  62. if(proces == index):
  63. #print("Ulazim u kriticni odsjecak. Filozof " + str(index))
  64. print("Filozof " + str(index) + " je za stolom")
  65. time.sleep(3)
  66. #izlazim iz KO
  67. #print("Izlazim iz kritincnog odsjecka. Filozof " + str(index))
  68. print("Sudjeluje na konferenciji, filozof " + str(index))
  69. #ukloni iz reda sebe i posalji poruku izlaska sa satom kao sto si usao
  70. redZahtjeva.pop(0) #ukloni prvog
  71. #salje izlazak svima sa sat koji je izvaden iz liste
  72. cjevovodi[index][1].send((IZLAZAK, index, sat))
  73.  
  74. break
  75.  
  76.  
  77.  
  78. for i in range(N):
  79. if i != index:
  80. cjevovodi[proces][1].send((ODGOVOR, index, sat))
  81.  
  82.  
  83. ZAHTJEV = "poruka zahtjeva"
  84. ODGOVOR = "poruka odgovora"
  85. IZLAZAK = "poruka izlaska"
  86.  
  87. if __name__ == '__main__':
  88. N = 3;
  89. if N < 2:
  90. print("Broj filozofa mora biti veci od 1.")
  91. exit(0)
  92.  
  93. cjevovodi = []
  94. procesi = []
  95.  
  96. for i in range(N):
  97. cjevovodi.append(Pipe(True))
  98.  
  99. for i in range(N):
  100. procesi.append(Process(target=filozof, args=(cjevovodi, i, N)))
  101.  
  102. for i in range(N):
  103. procesi[i].start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement