[Python] variabili globali e d'istanza: provengo da java
ugaciaka
ugaciaka a gmail.com
Mer 26 Dic 2007 19:22:08 CET
perfetto grazie mille...vedo che nonostante il mio impegno sono ancora
un pivello...
Comunque ho un'altro problema con global...in questo programma ho
dovuto proprio metterlo...è il caso particolare che devo lasciarlo? o
sennò come si toglie? grazie infinite...
#import nomemodulo...i moduli contengono classi...che a loro volta
contengono funzioni...
import threading
import time
import thread
import random
"""
thread lettori che devono agire concorrentemente all'uso della stanza
la stanza è una risorsa comune non condivisibile
gli accreditati hanno più priorità rispetto agli occasionali
gli occasionali oltre che aspettare che la sala sia libera devono aspettare che
non ci siano accreditati
uso semaofri privati
"""
class Lettore(threading.Thread):
#nomemodulo.Classe
#il costruttore, self e' come this in java...solo che non e' una
parola chiave...
def __init__(self, accreditato):
self.accreditato = accreditato
threading.Thread.__init__(self)
def run(self):
print self.getName() + " attivato \n"
time.sleep(random.randrange(10, 20, 1))
print self.getName() + " aspetta di entrare \n"
leggi(self.accreditato)
print self.getName() + " entra e legge \n"
time.sleep(random.randrange(5, 10, 1))
print self.getName() + " restituisce \n"
restituisci()
def leggi(accreditato):
#adesso i thread si mettono in coda
global coda_Accreditati, coda_Occasionali, stanza_libera
mutex.acquire()
if accreditato:
coda_Accreditati+=1
else:
coda_Occasionali+=1
mutex.release()
#ora i thread cercano di acquisire la risorsa
mutex.acquire()
if stanza_libera:
stanza_libera=False
if accreditato:
coda_Accreditati-=1
cAccreditati.release()
else:
if (not accreditato) and coda_Accreditati==0:
coda_Occasionali-=1
cOccasionali.release()
mutex.release()
if accreditato:
cAccreditati.acquire()
else:
cOccasionali.acquire()
def restituisci():
global coda_Accreditati, coda_Occasionali, stanza_libera
mutex.acquire()
if coda_Accreditati>0:
coda_Accreditati-=1
cAccreditati.release()
else:
if coda_Occasionali>0 and coda_Accreditati==0:
coda_Occasionali-=1
cOccasionali.release()
else:
stanza_libera=True
mutex.release()
#mutua esclusione..vabbeh non uso un semaforo...ma il discorso non cambia...
mutex = threading.Lock()
#dalla documentazione in rete si capisce che i semafori implementati
da python sono numerici...
#non ci vuole molta fantasia a renderli binari... ;-)
cAccreditati = threading.Semaphore(0)
cOccasionali = threading.Semaphore(0)
stanza_libera=True
coda_Accreditati=0
coda_Occasionali=0
num_Accreditati=3
num_Occasionali=3
#creo e attivo i miei thread
for i in range(num_Occasionali):
thread = Lettore(False)
thread.setName("Occasionale" + str(i))
thread.start()
for i in range(num_Accreditati):
thread = Lettore(True)
thread.setName("Accreditato" + str(i))
thread.start()
#questo programma provoca starvation degli occasionali se ciclato il
run..ovvio!!!... #http://docs.python.org/lib/semaphore-objects.html
More information about the Python
mailing list