2017-06-30 7 views
0

Mit der Bibliothek multiprocessing können Sie einen zweiten Prozess ausführen. Wie kann ich diesen Prozess nach dem Schließen des zweiten Prozesses aufrechterhalten? Ich schwöre, dass es das ursprünglich getan hat, und ich musste die Daemon-Option aktivieren, damit sie richtig schließt, aber jetzt kann ich sie nicht trennen.Den sekundären Prozess weiterlaufen lassen, nachdem der Hauptserver geschlossen wurde

Hier ist ein einfacher Code, der das Problem hat. Das Schließen des Hauptfensters schließt auch den zweiten Prozess, aber soweit ich weiß, sollte das nur passieren, wenn der Daemon auf True gesetzt ist.

from multiprocessing import Process 

def background_process(): 

    #So you can see it eating the cpu 
    while True: 
     pass 

if __name__ == '__main__': 

    p = Process(target=background_process) 
    p.daemon = False 
    p.start() 

Ich bin für die Skript Ziel auf allen Plattformen laufen zu lassen, um das Multiprocessing Teil ein großes Stück des Codes ist, würde ich es vorziehen, es zu halten ziemlich universell.

+0

Kennzeichnen Sie Ihre Quests immer mit "Windows", wenn Sie Windows-spezifische Antworten benötigen. Normalerweise würde man annehmen, dass Sie auf ein Posix-System abzielen. – kay

+0

Ah richtig danke, daran habe ich nie gedacht. Ich möchte idealerweise, dass es auf allen Systemen läuft, also versuche ich zu vermeiden, wichtige Teile für irgendein Betriebssystem zu machen :) – Peter

+0

Keiner dieser Prozesse besitzt ein Fenster. Beide Prozesse sind an eine Konsole angeschlossen (conhost.exe), die sie über Standard-I/O verwenden. Die Konsole besitzt das Fenster, und es ist hart codiert, um alle Prozesse zu beenden, die daran angehängt sind, wenn es geschlossen wird. – eryksun

Antwort

1

Sie können einfach os.fork() verwenden:

from os import fork 

child_pid = fork() 
if child_pid == 0: 
    '''This is the child process, i.e your background process''' 
else: 
    '''This is the parent process.''' 

Sie signals verwenden können, pipes und sockets (Unix-Sockets) zu kommunizieren.

multiprocessing.Process versucht, Ihr Leben einfacher zu machen, aber es tut selten. Ich würde dir raten, es überhaupt nicht zu benutzen.

+0

Danke, aber es ist für Unix-Systeme nur leider, kommt mit einem 'ImportError' auf Windows. Ich benutze 'Queue' aus Multiprocessing, was sehr nützlich ist, es ist nur' Process', was ziemlich viel Ärger verursacht: P – Peter

+0

Verwenden Sie Windows 10? Dann sollte die Linux-Version von Python funktionieren: http://timyreilly.azurewebsites.net/python-with-ubuntu-on-windows/ – kay

+0

@Peter: Yeah, Windows kann überhaupt nicht verzweigen. Die Cygwin-Emulation von fork() ist intensiv, hat aber nur eingeschränkte Kompatibilität. – wallyk

Verwandte Themen