Подтвердить что ты не робот

Возможно ли запустить функцию в подпроцессе без потоковой обработки или записи отдельного файла/script

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 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 okay" 

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