Pregunta

Esta es sólo la segunda pregunta con la etiqueta paralelo pitón. Después de mirar a través de la documentación y buscando en Google por el tema, he llegado aquí, ya que es donde he tenido la mejor suerte con respuestas y sugerencias.

La siguiente es la API (creo que se llama) que presenta toda la información pertinente 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()
    """

Aquí está mi presentar declaración con sus argumentos:

job_server.submit(reify, (pop1, pop2, 1000), 
                  depfuncs = (key_seq, Chromosome, Params, Node, Tree), 
                  modules = ("math",), 
                  callback = sum.add, globals = globals())

Todos los nombres en mayúsculas en depfuncs son los nombres de las clases. No estaba seguro de dónde colocar las clases o incluso si yo tendría que incluir ellos, ya que están en el diccionario globals(). Pero cuando me encontré con el depfuncs() vacío, que elevaría un error como "Tree not defined" (por ejemplo).

Ahora, key_seq es un generador, por lo que tienen que trabajar con una instancia del mismo con el fin de ser capaz de utilizar .next():

def key_seq():
    a = 0
    while True:
        yield a
        a = a + 1
ks = key_seq()

ks se define en globals(). Cuando no he incluido en ningún otro lugar, tengo un error que dice 'ks is not defined'. Cuando incluyo ks en depfuncs, este es el error:

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

Estoy bastante seguro de arg se refiere a ks. Por lo tanto, cuando le digo a .submit() sobre ks? No entiendo lo que se supone que ir a donde. Gracias.

¿Fue útil?

Solución

interesantes - está haciendo simulaciones genética? Lo pregunto porque veo 'Cromosoma' en ese país, y una vez desarrollado una simulación de la genética de poblaciones usando pitón paralelo.

Su enfoque se ve muy complicado. en mi programa de pitón en paralelo, he utilizado la siguiente llamada:

job = jobServer.submit( doRun, (param,))

¿Cómo he llegado lejos con esto? el truco es que la función doRun no se ejecuta en el mismo contexto que el contexto en el que se llama a complete. Por ejemplo (ejemplo artificial):

import os, pp

def doRun(param):
    print "your name is %s!" % os.getlogin()

jobServer = pp.Server()
jobServer.submit( doRun, (param,))

este código fallará. esto es debido a que el módulo os no existe en doRun - doRun no se ejecuta en el mismo contexto que someterse. Seguro, puede pasar os en el parámetro de module submit, pero ¿no es más fácil sólo para llamar import os en doRun?

pitón intentos paralelos para evitar que GIL del pitón mediante la ejecución de su función en un proceso totalmente independiente. se trata de hacer esto más fácil de tragar, ya que permiten CITA parámetros "paso" y espacios de nombres a su función, pero lo hace esto usando hacks. por ejemplo, sus clases se serializan con alguna variante de pickle y luego decodificados de vuelta en el nuevo proceso.

Pero en lugar de depender de los cortes de submit, simplemente aceptar la realidad de que su función se va a tener que hacer todo el trabajo de establecer es dirigido contexto. que realmente tiene dos funciones main - uno que establece la llamada a submit, y uno, que se llama a través de submit, que en realidad pone en marcha el trabajo que tiene que hacer.

Si se necesita el siguiente valor de su generador a estar disponible para una carrera pp, también pasarlo como un parámetro! esto evita las funciones lambda y referencias del generador, y te deja con pasar una variable simple!

mi código no se mantiene más, pero si usted es curioso echarle un vistazo aquí: http: //pps-spud.uchicago. edu / viewvc / cps / trunk / Python / fps.py? view = marcado

Otros consejos

Creo que debe estar pasando en lambda: ks.next () en lugar de los viejos de fricción de KS

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top