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
Znalazłem tylko dokumentację dotyczącą otwierania podprocesów za pomocą oddzielnych skryptów. Czy ktoś wie, jak przekazywać obiekty funkcyjne, a nawet prosty sposób na przekazywanie kodu funkcji?
Odpowiedzi:
Myślę, że szukasz czegoś bardziej podobnego do modułu wieloprocesorowego:
http://docs.python.org/library/multiprocessing.html#the-process-class
Moduł podprocesu służy do tworzenia procesów i robienia rzeczy na ich wejściu / wyjściu - nie do uruchamiania funkcji.
Oto
multiprocessing
wersja twojego kodu: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
źródło
processify
dekoratora jako skrótu: gist.github.com/2311116Możesz użyć standardowego
fork
wywołania systemowego Unix , jakos.fork()
.fork()
utworzy nowy proces z tym samym uruchomionym skryptem. W nowym procesie zwróci 0, podczas gdy w starym procesie zwróci identyfikator nowego procesu.child_pid = os.fork() if child_pid == 0: print "New proc" else: print "Old proc"
W przypadku biblioteki wyższego poziomu, która zapewnia obsługę wieloprocesorową, która zapewnia przenośną abstrakcję do korzystania z wielu procesów, istnieje moduł wieloprocesorowy . Jest artykuł na temat IBM DeveloperWorks, Multiprocessing with Python , z krótkim wprowadzeniem do obu technik.
źródło
fork
nie jest przenośny; Generalnie podam nieprzenośne odpowiedzi wraz z informacją, że są one nieprzenośne i pozwolę pytającemu zdecydować, czy to wystarczy. Kiedy zredagowałem moją odpowiedź, powinieneś być w stanie usunąć głos przeciw, jeśli uważasz, że wystarczająco go poprawiłem; choć bez urazy, jeśli nie, chciałem tylko sprawdzić, co zrobiłem źle.Powyższy post Briana McKenny o przetwarzaniu wieloprocesowym jest naprawdę pomocny, ale jeśli chcesz przejść ścieżką wątkową (w przeciwieństwie do opartej na procesach), ten przykład pomoże Ci zacząć:
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"
Możesz również użyć tej
setDaemon(True)
funkcji, aby natychmiast uruchomić wątek w tle.źródło