<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">Il giorno 21 maggio 2016 12:51, enrico franchi <span dir="ltr"><<a href="mailto:enrico.franchi@gmail.com" target="_blank">enrico.franchi@gmail.com</a>></span> ha scritto:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">2016-05-20 13:59 GMT+01:00 alessandro medici <span dir="ltr"><<a href="mailto:alexxandro.medici@gmail.com" target="_blank">alexxandro.medici@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"></blockquote></span><span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
- "multiprocessing" implica (a meno di eccezioni notevoli) "pickle di<br>
tutto"<br></blockquote><div><br></div></span><div>? cioè i dati vengono trasmessi via pickle e non via puntatori? Sure?</div><div>O invece non ho capito cosa affermi? Sorry per la mia ignoranza, ma</div><div>sono anziano e con i capelli MOLTO grigi. </div></div></div></div></blockquote><div><br></div><div>Non e' questione di ignoranza, basta rifletterci. Allora... multi-*processing*.</div><div>Diciamo che e' sano assumere che siano piu' processi, ok? Quindi piu' processi hanno spazi di indirizzamento separati (visto che sono appunto processi multipli). Quindi... cosa se ne fa un processo di un puntatore a uno spazio di indirizzamento a cui non ha accesso? Diciamo nulla? Ah... ma c'e' la memoria condivisa... ecco, ora riflettiamo anche su questa cosa. Quando tu scrivi</div><div><br></div><div>foo = Bar()</div><div><br></div><div>tu stai dicendo a Python di creare un oggetto. Bene. Non gli stai dicendo dove crearlo. Il che vuole dire che non e' in memoria condivisa. L'alternativa sarebbe immaginare che Python ficcasse *tutto quanto* in memoria condivisa... </div></div></div></div></blockquote><div><br></div><div>Già. Ho passato buona parte di ieri a guardarmi proprio il funzionamento del Manager<br></div><div>dei processi. Ed ho lasciato a metà quello sul funzionamento di pickle.</div><div>Il ragionamento che fai fila, però... Mettiamola così: mi piacerebbe che esistesse</div><div>un'opzione tale che permettesse di definire una variabile in uno spazio condiviso ed</div><div>accessibile direttamente dai singoli processi. Starebbe poi a me gestirla. E sicuramente</div><div>in molti casi sarebbe più veloce che impacchettare e spacchettare in giro dati che, magari,</div><div>servono solo in lettura. Poi, se voglio darmi da solo la zappa sui piedi, sono affari miei, in</div><div>pura logica Python :-)</div><div>Questo al di là della gestione bufferizzata dei dati elaborati da pickle e dalle sue piccole</div><div>(tutto sommato) limitazioni.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>il che vorrebbe anche dire che ogni singolo pezzo di dato di Python dovrebbe avere qualche lock che lo protegge... altro che GIL: avremmo gia' threading granulare [ah, certo, potremmo anche immaginare che schiaffa tutto in memoria condivisa e c'e' un GIL su questo... ma allora fare multithreading o multiprocessing in Python dovrebbe essere uguale, cosa che no ne'].</div></div></div></div></blockquote><div><br></div><div>No. Non occorrerebbe per tutto. Ovvio. </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>Segue che ... no, non possono essere semplici puntatori. "Come" viene fatto non puo' essere derivato da principi primi. E si, effettivamente e' Pickle.</div><div><br></div><div>Per inciso... presente il Manager di multiprocessing (e tutta la parte di "memoria condivisa" di multiprocessing)?</div><div>Bene... di condiviso non c'e' nulla. Funziona con scambio di messaggi (cioe' piglia gli oggetti, li serializza e li spara in giro). Insomma, e' un giocattolino che e' comodo da usare e da ragionarsi come la peggiore delle memorie condivise ed e' veloce come il piu' lento dei message passing. Un win win... per i linguaggi concorrenti...</div></div></div></div></blockquote><div><br></div><div>Già e vediamo se ho capito, allora, e uso come esempio proprio il programmino nel sito che aggiorna il dizionario:</div><div><br></div><div>Lancio da processo padre il processo figlio, al quale vengono passati, pickled via Manager, i dati</div><div>dei parametri, poi quando il figlio arriva al punto dell'aggiornamento del dizionario il figlio</div><div>chiama il Manager che pickla i dati di nuovo, li torno al padre (sotto GIL e quindi in lista d'attesa</div><div>se vi sono altri processi che vogliono fare la stessa cosa) che aggiorna il</div><div>dizionario e torna il controllo, sempre via Manager al figlio. Corretto?</div><div> </div><div>Se è così ora affronterei un multiprocesso con le idee molto più chiare sul cosa, quando, quanto</div><div>passare al processo stesso e sull'architettura che darei al soft.</div><div><br></div><div>Quindi grazie a tutti quelli che hanno scritto al riguardo: ho avuto le risposte che cercavo.</div><div><br></div><div>:-)</div><div><br></div><div>Alex</div></div><br></div></div>