Por que o Parallel Python funciona dessa maneira?
-
28-09-2019 - |
Pergunta
No Parallel Python, por que é necessário agrupar todos os módulos que a função passada precisará junto com variáveis e namespaces naquela chamada de envio de trabalho - quão necessário é preservar variáveis "globais" no nível do módulo?(se isso é tudo que está acontecendo)
função de envio:
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()
Solução
A razão pela qual pp
funciona da maneira que funciona, é criar uma nova instância do interpretador Python para cada trabalhador, que é completamente independente de qualquer coisa que tenha sido executada antes ou depois.Isso garante que não haja efeitos colaterais indesejados, como __future__
as importações estão ativas no processo de trabalho.O problema com isso é que torna as coisas muito mais complicadas de acertar e, na minha experiência com pp
, não particularmente robusto. pp
faz tenta tornar as coisas um pouco mais fáceis para o usuário, mas parece introduzir mais problemas do que soluções em seus esforços para fazer isso.
Se eu escrevesse um código projetado para uso em um cluster desde o início, provavelmente acabaria usando pp
, mas descobri que adaptar o código existente para trabalhar com pp
é um pesadelo.