Pregunta

Me gustaría para crear una concha que controlará un proceso separado que creé con el módulo de multiprocesamiento. ¿Posible? ¿Cómo?

EDIT:

Ya han logrado una forma de enviar comandos al proceso secundario: He creado un code.InteractiveConsole en ese proceso, y unido a una cola de entrada y una cola de salida, por lo que puede comandar la consola de mi proceso principal. Pero lo quiero en una concha, probablemente un wx.py.shell.Shell, por lo que un usuario del programa podría utilizarlo.

¿Fue útil?

Solución

  1. En primer lugar crear la cáscara
  2. desacoplar la concha de su aplicación, haciendo que sus vecinos vacío
  3. Crea tu cadena de código
  4. Compilar la cadena de código y obtener un objeto de código
  5. Ejecutar el objeto de código en la cáscara
    from wx.py.shell import Shell

    frm = wx.Frame(None)
    sh = Shell(frm)
    frm.Show()    
    sh.interp.locals = {}
    codeStr = """
    from multiprocessing import Process, Queue

    def f(q):
        q.put([42, None, 'hello'])

    q = Queue()   
    p = Process(target=f, args=(q,))
    p.start()
    print q.get()    # prints "[42, None, 'hello']"
    p.join()
    """

    code = compile(codeStr, '', 'exec')
    sh.interp.runcode(code)

Nota: El codeStr me robó el primer cartel no puede trabajar aquí debido a algunos problemas de decapado. Pero el punto es que puede ejecutar su propio codeStr forma remota en una cáscara.

Otros consejos

Se puede crear un Queue del cual se establece el proceso separado. Desde el Python Docs :

from multiprocessing import Process, Queue

def f(q):
    q.put([42, None, 'hello'])

if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print q.get()    # prints "[42, None, 'hello']"
    p.join()

Ejemplo: En el wx.py.shell.Shell Docs los parámetros constructur se dan como

__init__(self, parent, id, pos, size, style, introText, locals, 
         InterpClass, startupScript, execStartupScript, *args, **kwds) 

No he probado, pero locals podría ser un diccionario de variables locales, que se pueden pasar a la cáscara. Por lo tanto, me gustaría probar el siguiente:

def f(cmd_queue):
    shell = wx.py.shell.Shell(parent, id, pos, size, style, introText, locals(),
                              ...)

q = Queue()
p = Process(target=f, args=(q,))
p.start()

Dentro de la cáscara, a continuación, debe ser capaz de poner sus órdenes en cmd_queue que tienen entonces que ser entendida en el proceso padre a ser ejecutado.

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