[Python] aggiungere o distruggere una locked item in un dict mentre un'altro thread o asyncio lo legge/scrive per un'altra item?
Manlio Perillo
manlio.perillo a gmail.com
Mar 16 Feb 2016 15:05:17 CET
2016-02-16 10:53 GMT+01:00 alessandro medici <alexxandro.medici a gmail.com>:
> L'esempio che hai fatto non è quello che intendevo io
Quale esempio?
http://wiki.news.nic.it/QuotarBene
> : accedi a due voci
> contemporaneamente dello stesso dizionario nello stesso thread. Comunque
> proverò.
>
Sicuramente negli esempi che ho fatto l'accesso era da thread
differenti, altrimenti non avrei potuto far vedere le possibili
conseguenze della incorretta sincronizzazione.
> In ogni caso a me risulta che Gil rilascia i thread ogni 'gruppo' di
> istruzioni bytecode, non ogni singola istruzione.
È un dettaglio implementativo e, come tale, non ci farei troppo affidamento.
Già la presenza del GIL è un dettaglio implementativo, e probabilmente
molte applicazioni fallirebbero su IronPython o Jython, ma almeno il
GIL è presente sulle implementazioni maggiori di Python: CPython e
PyPy.
Vedi anche https://docs.python.org/2/library/sys.html#sys.setcheckinterval
> sovrascrivere una voce di un dizionario è, per quel che riguarda python, una
> istruzione atomica. La cosa è evidente se cerchi di scrivere sullo stesso
> terminale da ogni thread: quel che appare è un guazzabuglio confuso ma è
> anche evidente dal risultato degli script che ho scritto.
>
> O, quantomeno, la cosa funziona: mi son fatto diversi script in cui ogni
> thread modifica/usa/cancella/trattiene una voce (con un lock non atomico di
> controllo di accesso) in un dizionario e gli altri fanno quello che vogliono
> sulle ALTRE voci con le stesse regole. Ogni voce punta ad una voce univoca
> di un altro dizionario senza lock che viene cancellata/riscritta.
>
Magari se posti uno script (su gist o un pastebin) è la volta buona
che capisco cosa intendi con locked item.
A me risulta che l'unica cosa che puoi lockare è un dizionario, non un
item al suo interno.
Ciao Manlio
Maggiori informazioni sulla lista
Python