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
Я нашел только документацию по открытию подпроцессов с использованием отдельных скриптов. Кто-нибудь знает, как передать объекты функции или даже простой способ передать код функции?
Ответы:
Я думаю, вы ищете что-то более похожее на модуль многопроцессорности:
http://docs.python.org/library/multiprocessing.html#the-process-class
Модуль подпроцесса предназначен для создания процессов и выполнения действий с их вводом / выводом, а не для запуска функций.
Вот
multiprocessing
версия вашего кода:from multiprocessing import Process, Queue # must be a global function 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
источник
processify
декоратор как ярлык: gist.github.com/2311116Вы можете использовать стандартный
fork
системный вызов Unix , напримерos.fork()
.fork()
создаст новый процесс с тем же запущенным скриптом. В новом процессе он вернет 0, в то время как в старом процессе он вернет идентификатор нового процесса.child_pid = os.fork() if child_pid == 0: print "New proc" else: print "Old proc"
Для библиотеки более высокого уровня, которая обеспечивает поддержку многопроцессорности, которая предоставляет переносимую абстракцию для использования нескольких процессов, есть модуль многопроцессорности . Есть статья о IBM DeveloperWorks, Многопроцессорная обработка с Python , с кратким введением в оба метода.
источник
fork
это не переносимо; Обычно я даю непереносимые ответы вместе с информацией о том, что они непереносимы, и позволяю спрашивающему решить, достаточно ли этого для них. Поскольку я редактировал свой ответ, вы сможете удалить отрицательный голос, если считаете, что я его достаточно улучшил; хотя никаких обид, если вы этого не сделаете, я просто хотел проверить, что я сделал не так.Пост Брайана Маккенны о многопроцессорности, приведенный выше, действительно полезен, но если вы хотите пойти по многопоточному маршруту (в отличие от процесса на основе), этот пример поможет вам начать:
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)
функцию для немедленного фонового отображения потока.источник