2017-04-18 2 views
0

Ich weiß, wie wie diesesWie implementiert man Java-ähnliches asynchrones Verhalten in Python?

Instantiate einen neuen Thread einen Asynchron-Betrieb in Java implementieren -> Thread tut zeitraubend stuff (Disk IO oder Netzwerkaktivität) -> Thread beendet seine Arbeit und

zum Hauptthread führen passieren

Ich versuche, das gleiche in Python zu tun, aber konnte keinen Weg finden ... Ich habe über async und await, multiprocessing.Pool gelesen. Weder gibt mir eine klare Vorstellung davon, wie man das Gleiche erreichen kann.

Die nächste Art, wie ich gefunden ist multiprocessing.Pool.apply_async(Callable,Iterable,Callback) .Aber dieses Ding nicht in einer Klasse instanziiert werden kann, da es in if __name__=="__main__" gewickelt werden muss, und die __name__ ist mein Klassenname.

Jeder elegante Weg, Async in Python zu tun? Danke!

Antwort

2

Thema Basics

Werfen Sie einen Blick auf die threading Modul.

Ein Beispiel:

from threading import Thread 

# instanciate a new thread 
t = Thread(target=my_task) 
# let it do the time-consuming stuff 
t.start() 
# do extra stuff while t is working 
do_extra_stuff() 
# wait for t to finish 
t.join() 

Aufgabe

Jedoch Ergebnis zu erzielen, wenn Sie einen Wert von my_task erhalten möchten, müssen Sie entweder globale Variable, veränderbare Parameter verwenden, oder wickeln Sie Ihre Aufgabe in eine Klasse erweitert Thread.

Hier ist ein Beispiel mit einer Verpackungsklasse:

class MyThread(Thread): 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.result = None 

    def run(self): # this is the Thread method you need to override 
     # the time consuming stuff 
     self.result = some_result 

# same as before, but using the new class, so no need to specify target. 
t = MyThread() 
t.start() # will call t.run() for you. Never call t.run yourself (you'll lose every benefit from using Thread) 
t.join() # wait for t to be finished before getting result 
print(t.result) 

Übergeben von Argumenten

Um Argumente an die Aufgabe (einschließlich der Rückruf) übergeben, können Sie sie entweder als Klassenfelder setzen und sie in die füllen construcor, oder verwenden Sie das args kwarg von Thread ‚s construcor, wie folgt aus:

t = Thread(target=task_with_parametters, args=(arg1, arg2)) 

Thread wi Rufen Sie task_with_parametters wie folgt an:

task_with_parametters(arg1, arg2) 
+0

Kann ich einen Rückruf mit dieser Methode implementieren? – MiDaa

+0

Bearbeitet mit einem neuen Beispiel, ist das, was Sie brauchen? –

+0

Danke für Ihre Hilfe! Teilweise ja, aber der Join blockiert immer noch den Haupt-Thread, ich brauche einen Rückruf-Mechanismus, der eine Funktion aufruft (diese Funktion ist irgendwie definiert, wenn wir den Thread erstellen), wenn der Thread seinen Job beendet. – MiDaa

Verwandte Themen