[FSUG PD] multiprocessing senza semafori e messaggi diretti
alessandro medici
alexxandro.medici a gmail.com
Gio 15 Giu 2017 02:02:51 CEST
Alla base: invece di copiare dati si passa solo il link allo spazio dei
nomi.
L'idea è questa: ogni lancio via asyncio di un callable DEVE essere no gil.
Ed occorre, in fase di init, sovrascrivere le funzioni deputate alla
gestione dello spazio dei nomi ammettendo solo i nomi interni (e quindi
sottostanti) al callable oltre al nome superiore del callable da poter
chiamare solo nel caso opportuno.
In caso di chiamata di un nome di livello superiore verrà quindi ovviamente
chiamato un errore, intercettandolo con una opportuna try-except si potrà
uscire dal callable via un def torna qui, se al livello superiore una core
è libero per gestire un processo libero chiamante del callable che ha il
dato nel suo spazio dei nomi, glielo torna e il sub processo torna a
lavorare, altrimenti si passa al livello superiore. Un decoratore
@gestisciLaCosa potrà farlo facilmente.
Uscito dal callable il processo controlla la coda sulla funzione asyncio al
livello che lo ha lanciato, Se vi sono altri processi in coda vuol dire che
anche loro sono in attesa di dati. In tal caso il "core" del processore
deve abbandonare il processo nella coda e scalare di un livello: se trova
un processo in coda lo esegue, altrimenti scala al livello ancora
precedente e così via. Alla fine trova di sicuro un qualcosa che manca e lo
esegue e calcola.
La chiave del giochetto è che nessun processo può interrogare lo spazio dei
nomi di un processo di pari livello, ma solo di livelli superiori. Funziona
di sicuro, unico peccato: da python non è possibile .rilasciare gil, ma da
Cython si. Per fortuna :-)))
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.fsugpadova.org/pipermail/fsug-pd/attachments/20170615/bd85d5ae/attachment.htm>
Maggiori informazioni sulla lista
fsug-pd