2017-07-19 38 views
0

Ich habe dieses Beispiel-Code:Python - Threading - execute gleichzeitig

# some imports that I'm not including in the question 

class daemon: 
    def start(self): 
     # do something, I'm not including what this script does to not write useless code to the question 
     self.run() 

    def run(self): 
     """You should override this method when you subclass Daemon. 

     It will be called after the process has been daemonized by 
     start() or restart(). 
     """ 

class MyDaemon(daemon): 
    def run(self): 
     while True: 
      time.sleep(1) 

if __name__ == "__main__": 
    daemonz = MyDaemon('/tmp/daemon-example.pid') 
    daemonz.start() 

def firstfunction(): 
    # do something 
    secondfunction() 

def secondfunction(): 
    # do something 
    thirdfunction() 

def thirdfunction(): 
    # do something 

# here are some variables set that I am not writing 
firstfunction() 

Wie kann ich Austritt aus dem Lauf (Selbst-) Funktion der Klasse „Daemon“ und gehen die firstfunction auf Ausführen() wie in der schriftlichen letzte Linie? Ich bin ein Neuling mit Python, und ich versuche zu lernen

# EDIT ich es geschafft, den Daemon-Klasse in die treading Klasse zu implementieren. Aber ich bin in der gleichen Situation von zuerst, das Skript bleibt in Daemon-Klasse und führt die anderen Zeilen nicht aus.

class MyThread(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 

    def daemonize(self): 
    # istructions to daemonize my script process 

    def run(self): 
     self.daemonize() 


def my_function(): 
    print("MyFunction executed") # never executed 

thread = MyThread() 
thread.start() 
my_function() # the process is successfully damonized but 
       # this function is never executed 
+2

Ihr Code wird in der while-Schleife in MyDaemon stecken bleiben, nicht wahr? Aus diesem Grund erreicht Ihr Code nie die erste Funktion(). –

+0

Die 'while True' Bedingung in der 'run()' Methode wird Ihr Programm für immer in der Schleife halten. Hast du vor, stattdessen eine andere Bedingung zu haben? – Sanjay

+0

eigentlich muss ich die nächsten Anweisungen in def run (self) der Klasse "daemon" schreiben, aber im Moment habe ich nichts geschrieben, weil ich gefragt habe, was ich tun kann, um die anderen Befehle aus der Klasse zu übernehmen, wie in die letzte Zeile "firstfunction()". Wie kann ich? – AllExJ

Antwort

1

können Sie verwenden, um das break Stichwort Schleifen zu beenden, und in der nächsten Zeile fortgesetzt werden. return kann zum Beenden von Funktionen verwendet werden.

class daemon: 
    def start(self): 
     self.run() 

    def run(self): 
     while True: 
      break 
     return 
     print() # This never executes 

Wenn Sie MyDaemon wollen neben dem Rest des Codes ausführen können, müssen Sie es einen Prozess oder Thread machen. Der Code wird automatisch in der nächsten Zeile fortgesetzt, während die MyDaemon-Klasse (Thread/Prozess) ausgeführt wird.

import threading 


class MyThread(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 

    def run(self): 
     print("Thread started") 
     while True: 
      pass 


def my_function(): 
    print("MyFunction executed") 

thread = MyThread() 
thread.start()  # executes run(self) 
my_function() 

Dieser Code erzeugt das folgende Ergebnis:

Thread started 
MyFunction executed 

Um thread einen Daemon zu machen, Sie thread.setDaemon(True) verwenden können. Diese Funktion muss aufgerufen werden, bevor der Thread gestartet wird:

thread = MyThread() 
thread.setDaemon(True) 
thread.start() 
my_function() 
+0

und der Daemon wird weiter funktionieren? – AllExJ

+0

@AllexJ Nicht so sicher darüber. Lange Zeit seit ich in Python programmiert habe. Wenn ich richtig liege, benötigen Sie Multithreading oder Multiprocessing. Sie brauchen dann keinen Daemon, wenn der Prozess beendet wird, wenn Ihr Programm dies tut. Wenn ein Prozess gestartet wird, wird der Code in der nächsten Zeile fortgesetzt, während der Prozess läuft. Ich werde nach Multithreading suchen und hier ein Beispiel erstellen. :) – Andreas

+0

vielen Dank !! also muss ich in der Funktion "my_function" den Code setzen um den Prozess in Daemon umzuwandeln? – AllExJ