2010-01-12 14 views
41
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 manera fácil de pasar el código de función?¿Es posible ejecutar la función en un subproceso sin enhebrar o escribir un archivo/script separado?

+1

Creo que está buscando el módulo [multiprocesamiento] (http://docs.python.org/3.1/library/multiprocessing.html). –

Respuesta

65

Creo que se está buscando algo más como el módulo de multiprocesamiento:

http://docs.python.org/library/multiprocessing.html#the-process-class

El módulo subproceso es para procesos de desove y de hacer las cosas con su entrada/salida - no para las funciones de ejecución.

Aquí es 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 
+13

Puede usar el decorador 'processify' como un acceso directo: https://gist.github.com/2311116 – schlamar

+1

Supongo que esto clona el intérprete de Python y todo su entorno para el subproceso? – Jens

+0

Aquí hay una bifurcación de processify que funciona en python 3 y admite funciones de generador. https://gist.github.com/stuaxo/889db016e51264581b50 –

14

Puede utilizar la llamada al sistema estándar de Unix fork, como os.fork(). fork() creará un nuevo proceso, con la misma secuencia de comandos ejecutándose. En el nuevo proceso, devolverá 0, mientras que en el proceso anterior devolverá la identificación del proceso del nuevo proceso.

child_pid = os.fork() 
if child_pid == 0: 
    print "New proc" 
else: 
    print "Old proc" 

Para una biblioteca de alto nivel, que proporciona soporte multiproceso que proporciona una abstracción portátil para el uso de múltiples procesos, está el módulo de multiprocessing. Hay un artículo sobre IBM Developer Works, Multiprocessing with Python, con una breve introducción a ambas técnicas. post anterior

+0

Tengo curiosidad; ¿por qué el voto abajo? ¿Hay algo mal en mi respuesta? –

+0

El multiprocesamiento no es solo un envoltorio de nivel superior alrededor de la horquilla(), es un conjunto de herramientas de multiprocesamiento multiplataforma (que usa horquilla en Unix). Lo cual es importante, porque esto significa que se ejecuta, digamos, Windows, mientras que fork() no funciona. Edit: Y esta fue la razón del voto a favor, aunque más tarde decidí que probablemente no valía la pena. Demasiado tarde para llevarlo de vuelta, sin embargo. Edit2: O mejor dicho, tenedor() que se sugiere cuando no es multiplataforma fue el motivo. –

+1

@Devin, siempre se puede recuperar un downvote lo hizo, si así lo desea. –

3

Brian de McKenna sobre multiprocesamiento es realmente útil, pero si quería ir por el camino de rosca (en oposición a basada en el proceso), este ejemplo le ayudará a empezar:

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 característica setDaemon(True) de fondo el hilo inmediatamente.

Cuestiones relacionadas