[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