2010-01-12 4 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 

Я только нашел документацию по открытию подпроцессов с использованием отдельных скриптов. Кто-нибудь знает, как передать объекты функции или даже простой способ передать код функции?Возможно ли запустить функцию в подпроцессе без потоковой передачи или записи отдельного файла/скрипта.

+1

Я считаю, что вы ищете модуль [многопроцессорный] (http://docs.python.org/3.1/library/multiprocessing.html). –

ответ

65

Я думаю, что вы ищете что-то вроде модуля многопроцессорной:

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

Модуль подпроцесса для порождения процессов и делать вещи с их ввода/вывода - не для выполнения функций.

Вот multiprocessing версия кода:

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

Вы можете использовать декоратор 'processify' как ярлык: https://gist.github.com/2311116 – schlamar

+1

Я предполагаю, что это клонирует интерпретатор Python и всю его среду для подпроцесса? – Jens

+0

Вот вилка обработки, которая работает в python 3 и поддерживает функции генератора. https://gist.github.com/stuaxo/889db016e51264581b50 –

14

Вы можете использовать стандартный Unix fork системный вызов, так как os.fork(). fork() создаст новый процесс с тем же скриптом. В новом процессе он вернет 0, а в старом процессе он вернет идентификатор процесса нового процесса.

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

Для более высокого уровня библиотеки, которая обеспечивает поддержку мультипроцессорной, которая обеспечивает переносимые абстракции для использования нескольких процессов, есть multiprocessing модуля. В статье по IBM DeveloperWorks, Multiprocessing with Python есть краткое введение в оба метода. выше пост

+0

Мне любопытно; почему downvote? Что-то не так в моем ответе? –

+0

Многопроцессорность - это не просто оболочка более высокого уровня вокруг fork(), это многоплатформенный многопроцессорный инструментарий (в котором используется fork на unix). Это важно, потому что это означает, что он работает, скажем, в Windows, а fork() - нет. Редактировать: И это было причиной нисходящего потока, хотя позже я решил, что, вероятно, этого не стоило. Слишком поздно, чтобы вернуть его. Edit2: Или, скорее, предложение fork(), когда это не кросс-платформенная причина. –

+1

@Devin, вы всегда можете взять обратно вниз, если хотите. –

3

Брайана МакКенны о многопроцессорной действительно полезно, но если вы хотите идти вниз нарезной маршрут (в отличие от перерабатывают на основе), этот пример, чтобы вы начали:

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" 

Вы также можете использовать функция setDaemon(True) предназначена для мгновенного выделения потока.

Смежные вопросы