[Python] Mettere in pausa gli altri threads

Marco Giusti marco.giusti a gmail.com
Ven 4 Ott 2013 19:02:34 CEST


On Fri, Oct 04, 2013 at 04:52:40PM +0200, Luca wrote:
> Il giorno 04 ottobre 2013 15:34, Marco Giusti <marco.giusti a gmail.com> ha
> scritto:
> 
> >
> > Perdonami, puoi spiegarmelo come se avessi cinque anni? Sembra, da come
> > lo descrivi, che la copia di un file debba essere interrotta a metà per
> > poi riprendere con una politica differente. Invece il tuo codice sembra
> > dire il contrario, ovvero una copia deve essere finita sempre con la
> > politica con cui ha iniziato ma ogni nuova copia deve o aspettare una
> > risposta o utilizzare la politica selezionata.
> >
> Beh a dire il vero è opinione comunque che io sia un genio ad esporre male
> le cose :\
> 
> in effetti  è come dici tu. è la nuova copia che parte che deve aspettre
> una risposta.
> Solo che la verifica vene fatta dentro al worker.
> 
> Ti pastobinno la funzione operaia con le modifiche che stavo cercando di
> testare sullo script di test.
> Magari così capisci meglio che intendo e magari mi indicate altri errori di
> concetto.
> 
> http://pastebin.com/rFLzW7xy

Senza (troppo) leggere il tuo codice, concettualmente allora è come
avevo descritto nella mia prima email. Supponi che hai i due lock come
ti avevo descritto, il worker si comporta più o meno così:

	def worker():
		while True:
			path = q.get()
			if os.path.exists(path) and override is ASK:
				with w:
					global override
					override = ask_dialog()
			with r:
				copy(path)
			q.task_done()

questo è a larghe spanne quello che dovrebbe fare. I due lock sono
speciali. r lo puoi acquisire solo se nessuno reclama w. w lo puoi
acquisire solo se nessuno ha acquisito r. Così se due operazioni di
copia sono in atto e una terza vuole sovrascrivere un file, la terza si
blocca fintanto che le due precedenti non sono completate. Nuove
operazioni di copia sono bloccate perché qualcuno reclama w. Quando w
viene rilasciato, i worker possono di nuovo acquisire r.

Ti allego un esempio con il lock preso qui[1].

Ciao
Marco

[1] http://code.activestate.com/recipes/577803-reader-writer-lock-with-priority-for-writers/
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        rwlock.py
Tipo:        text/x-python
Dimensione:  3304 bytes
Descrizione: non disponibile
URL:         <http://lists.python.it/pipermail/python/attachments/20131004/e524a7b1/attachment-0001.py>


Maggiori informazioni sulla lista Python