Python parallèle: Comment puis-je fournir des arguments à « soumettre »?
-
20-09-2019 - |
Question
Ceci est seulement la deuxième question avec l'étiquette parallèle python. Après avoir regardé à travers la documentation et googler pour le sujet, je suis venu ici car il est là que j'ai eu la meilleure chance avec des réponses et suggestions.
Ce qui suit est l'API (je pense qu'il est appelé) qui soumet toutes les informations pertinentes aux pp.
def 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()
"""
Voici ma déclaration soumettre ses arguments:
job_server.submit(reify, (pop1, pop2, 1000),
depfuncs = (key_seq, Chromosome, Params, Node, Tree),
modules = ("math",),
callback = sum.add, globals = globals())
Tous les noms capitalisés dans depfuncs
sont les noms des classes. Je ne savais pas où mettre les classes ou même si je aurais besoin de les inclure comme dans le dictionnaire globals()
. Mais quand je l'ai couru avec le depfuncs()
vide, il soulèverait une erreur comme « Tree not defined
» (par exemple).
Maintenant, key_seq
est un générateur, donc je dois travailler avec une instance de celui-ci afin de pouvoir utiliser .next()
:
def key_seq():
a = 0
while True:
yield a
a = a + 1
ks = key_seq()
ks
est défini dans globals()
. Quand je ne mentionnaient pas nulle part ailleurs, je suis une erreur disant « ks is not defined
».
Quand je ks
à inclure depfuncs
, c'est l'erreur:
Traceback (most recent call last):
File "C:\Python26\Code\gppp.py", line 459, in <module>
job_server.submit(reify, (pop1, pop2, 1000), depfuncs = (key_seq, ks, Chromosome, Params, Node, Tree), modules = ("math",), callback = sum.add, globals = globals())
File "C:\Python26\lib\site-packages\pp.py", line 449, in submit
sfunc = self.__dumpsfunc((func, ) + depfuncs, modules)
File "C:\Python26\lib\site-packages\pp.py", line 634, in __dumpsfunc
sources = [self.__get_source(func) for func in funcs]
File "C:\Python26\lib\site-packages\pp.py", line 713, in __get_source
sourcelines = inspect.getsourcelines(func)[0]
File "C:\Python26\lib\inspect.py", line 678, in getsourcelines
lines, lnum = findsource(object)
File "C:\Python26\lib\inspect.py", line 519, in findsource
file = getsourcefile(object) or getfile(object)
File "C:\Python26\lib\inspect.py", line 441, in getsourcefile
filename = getfile(object)
File "C:\Python26\lib\inspect.py", line 418, in getfile
raise TypeError('arg is not a module, class, method, '
TypeError: arg is not a module, class, method, function, traceback, frame, or code object
Je suis assez sûr arg
fait référence à ks
. Alors, où dois-je dire à propos .submit()
ks
? Je ne comprends pas ce qui est censé aller où. Merci.
La solution
intéressantes - vous faites des simulations de la génétique? Je demande parce que je vois « Chromosome » là-dedans, et j'ai déjà développé une simulation de la génétique des populations en utilisant python parallèle.
votre approche ressemble vraiment compliquée. dans mon programme python parallèle, je l'ai utilisé l'appel suivant:
job = jobServer.submit( doRun, (param,))
comment ai-je sortir avec cela? l'astuce est que la fonction doRun ne fonctionne pas dans le même contexte que le contexte dans lequel vous appelez sumbit. Par exemple (exemple artificiel):
import os, pp
def doRun(param):
print "your name is %s!" % os.getlogin()
jobServer = pp.Server()
jobServer.submit( doRun, (param,))
ce code échouera. c'est parce que le module os n'existe pas dans doRun - doRun ne fonctionne pas dans le même contexte que se soumettre. Bien sûr, vous pouvez passer os
dans le paramètre module
de submit
, mais est-il pas plus facile de faire appel à import os
doRun?
essaie de python parallèles pour éviter GIL de python en exécutant votre fonction dans un processus totalement distinct. il essaie de rendre cela plus facile à avaler en vous laissant quote- les paramètres et les espaces de noms « passe » à votre fonction, mais il le fait en utilisant hacks. par exemple, vos cours seront sérialisés à l'aide d'une variante de pickle
puis désérialisé dans le nouveau processus.
Mais au lieu de compter sur les hacks de submit
, juste accepter la réalité que votre fonction va devoir faire tout le travail de mise en place de son contexte géré. vous avez vraiment deux fonctions main
- qui met en place l'appel à submit
, et un, que vous appelez via submit
, qui définit en fait le travail que vous devez faire.
si vous avez besoin de la prochaine valeur de votre générateur disponible pour une course pp, aussi passer comme paramètre! cela évite les fonctions lambda et les références de générateur, et vous laisse passer une variable simple!
mon code est plus maintenu, mais si vous êtes curieux de vérifier dehors ici: http: //pps-spud.uchicago. edu / viewvc / ips / trunk / python / fps.py? view = balisage
Autres conseils
Je pense que vous devriez être de passage dans lambda: ks.next () au lieu de vieux ks plaine