Perché parallela Python funziona il modo in cui lo fa?
-
28-09-2019 - |
Domanda
In parallelo Python, perché è necessario per avvolgere tutti i moduli la funzione passata avrà bisogno insieme con le variabili e gli spazi dei nomi in quella chiamata l'invio di lavori - quanto sia necessario è di preservare livello variabili "globali" del modulo? (Se questo è tutto quello che sta succedendo)
presentare la funzione:
submit(self, func, args=(), depfuncs=(), modules=(), callback=None, callbackargs=(),group='default', globals=None)
Submits function to the execution queue
func - function to be executed
args - tuple with arguments of the 'func'
depfuncs - tuple with functions which might be called from 'func'
modules - tuple with module names to import
callback - callback function which will be called with argument
list equal to callbackargs+(result,)
as soon as calculation is done
callbackargs - additional arguments for callback function
group - job group, is used when wait(group) is called to wait for
jobs in a given group to finish
globals - dictionary from which all modules, functions and classes
will be imported, for instance: globals=globals()
Soluzione
La ragione per cui pp
funziona il modo in cui lo fa, è che rende un'istanza fresca dell'interprete Python per ogni lavoratore, che è completamente indipendente da tutto ciò che ha eseguito prima o dopo. Ciò assicura che non ci sono effetti collaterali indesiderate, quali le importazioni __future__
essere attivi nel processo di lavoro. Il problema di questo è che rende le cose molto più complicato da ottenere, e nella mia esperienza con pp
, non particolarmente robusto. pp
fa cercare di rendere le cose un po 'più facile per l'utente, ma sembra introdurre più problemi di quanti ne risolva nei suoi sforzi per farlo.
Se dovessi scrivere il codice che è stato progettato per l'uso su un cluster dall'inizio, avrei probabilmente finire con pp
, ma ho trovato che l'adattamento codice esistente al lavoro con pp
è un incubo.