Возможно ли запустить функцию в подпроцессе без потоковой обработки или записи отдельного файла/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
Я только нашел документацию об открытии подпроцессов с использованием отдельных скриптов. Кто-нибудь знает, как передать объекты функций или даже простой способ передать код функции?
Ответы
Ответ 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)
для немедленного фонового потока.