Можно ли запустить функцию в подпроцессе без многопоточности или написания отдельного файла / скрипта. - PullRequest
52 голосов
/ 12 января 2010
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

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

Ответы [ 3 ]

80 голосов
/ 12 января 2010

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

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 голосов
/ 12 января 2010

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

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

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

5 голосов
/ 07 августа 2014

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

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) для немедленного создания фона темы.

...