Python podržava mnoge sinkronizacijske mehanizme. Semafor je jedan on najjednostavnijih. Njegovo korištenje je jednako prikazanome na predavanju uz razliku u imenima/sintaksi.
Semafor treba prvo stvoriti i incijalizirati:
sem = threading.Semaphore ( value = POČETNA_VRIJEDNOST ) # npr. 1Pozivi ČekajOSEM(sem) i PostaviOSEM(sem) pozivaju se sa:
sem.acquire() # ČekajSEM(sem) sem.release() # PostaviSEM(sem)
U primjeru se stvaraju 3 dretve koje ulaze u kritični odsječak štićen semaforom KO. (U datoteci ima i dio koda za prihvat signala.)
import time, threading KO = threading.Semaphore ( value = 1 ) # inicijaliziraj semafor s poč. vr. 1 def dretva (id): for i in range(3): KO.acquire() # ČekajSEM(KO) print ( "Dretva " + str(id) + " u KO" ) time.sleep(2) print ( "Dretva " + str(id) + " izlazi iz KO" ) KO.release() # PostaviSEM(KO) time.sleep(1) def main(): signal.signal ( signal.SIGINT, signal_kraj ) for i in range(3): opisnik = threading.Thread ( target = dretva, args = (i+1,) ) opisnik.start() # glavna dretva ne čeka na druge, ali Python interpreter će i dalje # izvoditi ostale dretve if __name__ == "__main__": main()