¿Es posible ejecutar la función en un subproceso sin subprocesos o escribir un archivo / script separado?

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 cómo abrir subprocesos usando scripts separados. ¿Alguien sabe cómo pasar objetos de función o incluso una forma fácil de pasar el código de función?

Creo que estás buscando algo más como el 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í está una versión multiprocessing 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 

Puede usar la llamada del sistema de fork Unix estándar, como os.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 el uso de 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.

La publicación anterior de Brian McKenna sobre multiprocesamiento es realmente útil, pero si desea seguir la ruta por hilos (a diferencia del proceso), 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 usar la función setDaemon(True) para setDaemon(True) fondo del hilo inmediatamente.