Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- from sys import *
- import time
- from multiprocessing import Process, Pipe
- def filozof(cjevovodi, index, N):
- print("Filozof " + str(index) + " sudjeluje na konferenciji.")
- time.sleep(1)
- primljeniOdgovori = 0
- logickiSat = random.randrange(N*N)
- redZahtjeva = []
- pocetniLogickiSat = logickiSat
- print ("Filozof " + str(index) + " salje zahtjev za ulazak u KO")
- #stavi u svoj red zahtjev
- zahtjev = (ZAHTJEV, index, pocetniLogickiSat)
- redZahtjeva.append(zahtjev)
- for i in range(N):
- if i == index:
- continue
- cjevovodi[i][1].send(zahtjev)
- while(True):
- (tip, proces, sat) = cjevovodi[index][0].recv(); #blokira dok se nesto ne primi
- #print("Primljena poruka: " + tip + " u procesu " + str(index) +" od procesa " + str(proces))
- if(tip == ZAHTJEV):
- redZahtjeva.append((tip, proces, sat))
- sorted(redZahtjeva, key=lambda x: x[2])
- (tip, proces, sat) = redZahtjeva[0]
- if(tip == IZLAZAK):
- #ukloni iz reda
- #sorted(redZahtjeva, key=lambda x: x[2])
- #sortiraj svoju listu i ukloni prvi
- #redZahtjeva.pop()
- redZahtjeva.remove((ZAHTJEV, proces, sat))
- continue
- if(tip == ZAHTJEV):
- #uskladi sat i stavi u red zahtjeva
- pocetniLogickiSat = max(pocetniLogickiSat, sat) + 1
- redZahtjeva.append((tip, proces, sat))
- #salji odgovor s novim satom
- cjevovodi[proces][1].send((ODGOVOR, index, pocetniLogickiSat))
- continue
- #if (tip != ODGOVOR or proces != index):
- # continue
- primljeniOdgovori = primljeniOdgovori + 1
- if(primljeniOdgovori == N-1):
- sorted(redZahtjeva, key=lambda x: x[2])
- #print(redZahtjeva)
- (tip, proces, sat) = redZahtjeva[len(redZahtjeva)-1]
- #prviZahtjevIndex = [x[0] for x in redZahtjeva]
- if(proces == index):
- #print("Ulazim u kriticni odsjecak. Filozof " + str(index))
- print("Filozof " + str(index) + " je za stolom")
- time.sleep(3)
- #izlazim iz KO
- #print("Izlazim iz kritincnog odsjecka. Filozof " + str(index))
- print("Sudjeluje na konferenciji, filozof " + str(index))
- #ukloni iz reda sebe i posalji poruku izlaska sa satom kao sto si usao
- redZahtjeva.pop(0) #ukloni prvog
- #salje izlazak svima sa sat koji je izvaden iz liste
- cjevovodi[index][1].send((IZLAZAK, index, sat))
- break
- for i in range(N):
- if i != index:
- cjevovodi[proces][1].send((ODGOVOR, index, sat))
- ZAHTJEV = "poruka zahtjeva"
- ODGOVOR = "poruka odgovora"
- IZLAZAK = "poruka izlaska"
- if __name__ == '__main__':
- N = 3;
- if N < 2:
- print("Broj filozofa mora biti veci od 1.")
- exit(0)
- cjevovodi = []
- procesi = []
- for i in range(N):
- cjevovodi.append(Pipe(True))
- for i in range(N):
- procesi.append(Process(target=filozof, args=(cjevovodi, i, N)))
- for i in range(N):
- procesi[i].start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement