import subprocess
def my_function(x):
return x + 100
output = subprocess.Popen(my_function, 1) #I would like to pass the function object and its arguments
print output
#desired output: 101
Solo he encontrado documentación sobre la apertura de subprocesos utilizando scripts separados. ¿Alguien sabe cómo pasar objetos de función o incluso una forma fácil de pasar código de función?
Respuestas:
Creo que está buscando algo más parecido al módulo de multiprocesamiento:
http://docs.python.org/library/multiprocessing.html#the-process-class
El módulo de subproceso es para generar procesos y hacer cosas con su entrada / salida, no para ejecutar funciones.
Aquí hay una
multiprocessing
versión de su código:from multiprocessing import Process, Queue def my_function(q, x): q.put(x + 100) if __name__ == '__main__': queue = Queue() p = Process(target=my_function, args=(queue, 1)) p.start() p.join() # this blocks until the process terminates result = queue.get() print result
fuente
processify
decorador como atajo: gist.github.com/2311116Puede utilizar la
fork
llamada estándar del sistema Unix , comoos.fork()
.fork()
creará un nuevo proceso, con el mismo script en ejecución. En el nuevo proceso, devolverá 0, mientras que en el proceso anterior devolverá el ID de proceso del nuevo proceso.child_pid = os.fork() if child_pid == 0: print "New proc" else: print "Old proc"
Para una biblioteca de nivel superior, que proporciona soporte de multiprocesamiento que proporciona una abstracción portátil para usar múltiples procesos, está el módulo de multiprocesamiento . Hay un artículo sobre IBM DeveloperWorks, Multiprocesamiento con Python , con una breve introducción a ambas técnicas.
fuente
fork
no es portátil; Por lo general, daré respuestas no portátiles junto con información de que no son portátiles y dejaré que el interrogador decida si eso es suficiente para ellos. Como he editado mi respuesta, debería poder eliminar el voto negativo si cree que lo he mejorado lo suficiente; aunque no hay resentimientos si no lo haces, solo quería comprobar qué había hecho mal.La publicación anterior de Brian McKenna sobre multiprocesamiento es realmente útil, pero si desea seguir la ruta del subproceso (a diferencia de la basada en procesos), este ejemplo lo ayudará a comenzar:
import threading import time def blocker(): while True: print "Oh, sorry, am I in the way?" time.sleep(1) t = threading.Thread(name='child procs', target=blocker) t.start() # Prove that we passed through the blocking call print "No, that's okay"
También puede utilizar la
setDaemon(True)
función para poner en segundo plano el hilo inmediatamente.fuente