Sinkronizacija semaforima u Pythonu

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. 1
Pozivi ČekajOSEM(sem) i PostaviOSEM(sem) pozivaju se sa:
sem.acquire() # ČekajSEM(sem)
sem.release() # PostaviSEM(sem)

Primjer lab3.py

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()