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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top