Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from multiprocessing import Process, Queue, Lock
- import time
- def kanibal(red, mojIndex, sljedeciIndex, znacka):
- presao = False
- while (True):
- time.sleep(1)
- id, znacka = red.get(block=True)
- if (id != mojIndex):
- red.put((id, znacka))
- else:
- if(presao==False):
- brojMisionara = brojiZnak('m', znacka)
- brojKanibala = brojiZnak('k', znacka)
- print ("K kanibali " + str(brojKanibala))
- print ("K misionari " + str(brojMisionara))
- if(brojKanibala< brojMisionara or brojMisionara==0):
- print("PrijeK " + str(znacka))
- for i in range(0, 3):
- if (znacka[i] == '-'):
- znacka[i] = 'k'
- presao = True
- break
- print("Poslije K" + str(znacka))
- red.put((sljedeciIndex, znacka))
- print("Proces " + str(mojIndex) + " Sadrzaj poruke: " + str(znacka))
- #time.sleep(1)
- def brojiZnak(znak,znacka):
- br = 0
- for i in range(0, 3):
- if(znacka[i] == znak):
- br = br+1
- return br
- def misionar(red, mojIndex, sljedeciIndex, znacka):
- presao = False
- while(True) :
- time.sleep(1)
- id, znacka = red.get(block=True)
- if (id != mojIndex) :
- red.put((id, znacka))
- else:
- if(presao==False):
- brojMisionara = brojiZnak('m', znacka)
- brojKanibala = brojiZnak('k', znacka)
- print ("M kanibali " + str(brojKanibala))
- print ("M misionari " + str(brojMisionara))
- print(str(znacka))
- if(brojKanibala <= brojMisionara or brojKanibala==1):
- #1 ako je camac prazan
- #presao = False
- print("prije" + str(znacka))
- for i in range(0, 3):
- if(znacka[i] == '-'):
- znacka[i] = 'm'
- presao = True
- break
- print("Poslije" + str(znacka))
- red.put((sljedeciIndex, znacka))
- print("Proces " + str(mojIndex) + " Sadrzaj poruke: " + str(znacka))
- #time.sleep(1)
- def camac(red, mojIndex, sljedeciIndex, znacka):
- red.put((sljedeciIndex, znacka))
- while(True):
- #time.sleep(1)
- brojBudenja = 20 # 20*200 = 4 sec, spavam 200 ms
- while(brojBudenja>0):
- brojBudenja = brojBudenja-1
- id, znacka = red.get(block=True)
- if (id != mojIndex):
- red.put((id, znacka))
- continue
- red.put((sljedeciIndex, znacka))
- time.sleep(0.2)
- id, znacka = red.get(block=True)
- if (id != mojIndex):
- red.put((id, znacka))
- continue
- brojPutnika = 3 - znacka.count('-')
- if(brojPutnika>=1):
- print ('Camac prevozi ' + str(brojPutnika) + ' putnika.')
- print ("Prevezeni: " + str(znacka))
- #znacka = ['-', '-', '-']
- znacka[0] = '-'
- znacka[1] = '-'
- znacka[2] = '-'
- continue
- time.sleep(4)
- print ("budan")
- brojPutnika = 3 - znacka.count('-')
- if(brojPutnika == 0):
- break;
- N = 4 #kanibali
- M = 4 #misionari
- if __name__ == '__main__':
- index = 0
- redPoruka = Queue()
- znacka = ['-', '-', '-']
- for i in range(N):
- p = Process(target=kanibal, args=(redPoruka, index, index+1, znacka))
- index = index + 1
- p.start()
- for i in range(M):
- p = Process(target=misionar, args=(redPoruka, index, index+1, znacka))
- index = index + 1
- p.start() #pokrece gore stvoreni proces
- p = Process(target=camac, args=(redPoruka, index, 0, znacka))
- p.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement