2009-11-11 10 views
7

W języku Python w systemie Windows: chcę uruchomić kod w oddzielnym procesie. I nie chcę, żeby rodzic czekał, aż to się skończy. Próbowano:Uruchom proces i zakończ, nie czekając na niego.

from multiprocessing import Process 
from time import sleep 

def count_sheeps(number): 
    """Count all them sheeps.""" 
    for sheep in range(number): 
     sleep(1) 

if __name__ == "__main__": 
    p = Process(target=count_sheeps, args=(5,)) 
    p.start() 
    print("Let's just forget about it and quit here and now.") 
    exit() 

, która rozpoczyna proces potomny i kontynuuje wykonywanie. Jednak gdy rodzic osiąga koniec, wciąż czeka na wyjście dziecka.

Czy istnieje sposób na umożliwienie rodzicowi rzucenia palenia, nawet gdy dziecko jest uruchomione? Oczywiście, mógłbym po prostu uruchomić nowego interpretera pythonów przy użyciu subprocess.Popen i podać mu liczenie owiec jako oddzielny skrypt.

Cały ten moduł służy do odtwarzania procesów kodu Pythona, więc chciałbym to wykorzystać zamiast hakować w systemie operacyjnym. Byłoby świetnie, gdyby ten sam kod działał wszędzie tam, gdzie działa Python, nie tylko w systemie Windows.

from subprocess import Popen 
Popen([ "foo.exe", "arg1", "arg2", "arg3") 

See the Python doco, w szczególności: są wycofywane

+0

W tym miejscu zwykle widzę przeciwny problem. – mob

Odpowiedz

4

pomocą modułu subprocess innymi sposobami kontroli podproces (. Os.system, os.spawn * os.popen * popen2 , polecenia). P_NOWAIT przykład.

Będziesz musiał uruchomić nowego interpretera Pythona w podprocesie, więc "foo.exe" powyżej będzie prawdopodobnie "python.exe".

EDIT:

Po prostu przeglądu dokumentacji modułu wieloprocesorowe:

join_thread(): przyłączyć się do tła wątek. To może być użyte tylko po wywołaniu metody close(). Blokuje się do czasu zakończenia wątku tła, , zapewniając, że wszystkie dane w buforze zostały przepłukane do rury.

Domyślnie, jeśli proces nie jest twórca kolejki następnie opuścić to będzie próbował dołączyć tła wątek w kolejce. Proces może wykonać wywołanie cancel_join_thread(), aby zrobić nic.

cancel_join_thread(): Zapobiegać join_thread() z blokowania. W szczególności w zapobiega to łączeniu się wątku tła z po zakończeniu procesu - , patrz join_thread().

Wygląda na to, że powinieneś być w stanie zadzwonić pod numer cancel_join_thread(), aby uzyskać pożądane zachowanie. Nigdy nie używałem tej metody (i nie zdawałem sobie sprawy z jej istnienia aż do minuty temu!), Więc daj nam znać, czy to działa dla ciebie.

+0

Proszę nie "importować *". –

+0

Sure - usunięto import * –

+0

cancel_join_thread() wydaje się być na coś innego: tak, że proces może zakończyć się nawet wtedy, gdy używana przez niego kolejka nie jest pusta. Jednak chyba że w moim przykładzie jest cicho utworzona i wypełniona mój wkład, nie sądzę, że to by mi pomogło. –

1

Pod Linuksem można było fork, ale to nie zadziała w systemie Windows.Myślę, że najprostszym sposobem jest uruchomienie nowego procesu Pythona, przez oddanie count_sheeps w oddzielnym pliku i Popen('python count_sheeps.py')

+0

Uzgodnione - jedyną trudnością jest zestawienie argumentów dotyczących metody. Wystarczająco łatwe dla count_sheeps (liczba), gdzie "liczba" jest liczbą całkowitą. W przypadku złożonych argumentów metoda multiprocessing.Process jest sprytnym podejściem! –

+0

Tak, to kiepskie widelec nie jest w systemie Windows. Wygląda na to, że będę musiał iść tą drogą. –

-2

Zawsze możesz rozpocząć nowy wątek, a nazywają myNewThread.daemon (true) przed wywołaniem to start() metoda .

Ten wątek będzie kontynuowany, gdy główny proces zostanie zakończony.

+0

Dzięki, ale nie bardzo. Nić Daemona zostaje zabita po wyjściu głównego programu. Różnica od nie demonicznych wątków polega na tym, że program po prostu je zabija, zamiast czekać, aż skończą się same. –

+0

Wątek demona AFAICT jest dokładnie tym, czego potrzeba w oryginalnym pytaniu. Prawdą jest jednak, że wątki demona nie pozostały uruchomione, co w tej odpowiedzi było nieprawidłowe. – ketorin

2

Możesz zadeklarować proces jako demona z p.daemon = True. Jak mówi http://docs.python.org/2/library/threading.html#thread-objects: "Znaczeniem tej flagi jest to, że cały program Pythona kończy się, gdy pozostaną tylko wątki demona."

from multiprocessing import Process 
from time import sleep 

def count_sheeps(number): 
    """Count all them sheeps.""" 
    for sheep in range(number): 
     sleep(1) 

if __name__ == "__main__": 
    p = Process(target=count_sheeps, args=(5,)) 
    p.daemon = True 
    p.start() 
    print("Let's just forget about it and quit here and now.") 
    exit() 
Powiązane problemy