Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.43 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. redZahtjeva = 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. print("Izlazak")
  41. redZahtjeva.remove((ZAHTJEV, proces, sat))
  42. continue
  43.  
  44. if(tip == ZAHTJEV and proces != index):
  45. #uskladi sat i stavi u red zahtjeva
  46. pocetniLogickiSat = max(pocetniLogickiSat, sat) + 1
  47. redZahtjeva.append((tip, proces, sat))
  48. #salji odgovor s novim satom
  49. cjevovodi[proces][1].send((ODGOVOR, index, pocetniLogickiSat))
  50. print("zahtjev")
  51.  
  52. continue
  53.  
  54. #if (tip != ODGOVOR or proces != index):
  55. # continue
  56. if(tip == ODGOVOR):
  57. primljeniOdgovori = primljeniOdgovori + 1
  58. redZahtjeva.pop()
  59. print("Odgovor")
  60.  
  61.  
  62.  
  63. if(primljeniOdgovori == N-1):
  64. print("Primljeni")
  65. sorted(redZahtjeva, key=lambda x: x[2])
  66. #print(redZahtjeva)
  67. (tip, proces, sat) = redZahtjeva[0]
  68.  
  69. #prviZahtjevIndex = [x[0] for x in redZahtjeva]
  70. if(proces == index):
  71. #print("Ulazim u kriticni odsjecak. Filozof " + str(index))
  72. print("Filozof " + str(index) + " je za stolom")
  73. time.sleep(3)
  74. #izlazim iz KO
  75. #print("Izlazim iz kritincnog odsjecka. Filozof " + str(index))
  76. print("Sudjeluje na konferenciji, filozof " + str(index))
  77. #ukloni iz reda sebe i posalji poruku izlaska sa satom kao sto si usao
  78. redZahtjeva.pop(0) #ukloni prvog
  79. #salje izlazak svima sa sat koji je izvaden iz liste
  80. cjevovodi[index][1].send((IZLAZAK, index, sat))
  81.  
  82. break
  83.  
  84.  
  85.  
  86. for i in range(N):
  87. if i != index:
  88. cjevovodi[proces][1].send((ODGOVOR, index, sat))
  89.  
  90.  
  91. ZAHTJEV = "poruka zahtjeva"
  92. ODGOVOR = "poruka odgovora"
  93. IZLAZAK = "poruka izlaska"
  94.  
  95. if __name__ == '__main__':
  96. N = 3;
  97. if N < 2:
  98. print("Broj filozofa mora biti veci od 1.")
  99. exit(0)
  100.  
  101. cjevovodi = []
  102. procesi = []
  103.  
  104. for i in range(N):
  105. cjevovodi.append(Pipe(True))
  106.  
  107. for i in range(N):
  108. procesi.append(Process(target=filozof, args=(cjevovodi, i, N)))
  109.  
  110. for i in range(N):
  111. procesi[i].start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement