Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Erläuterung der Verwendung von Tornado-Coroutinen in Python (mit Beispielen)
Durch die Verwendung von Tornado-Coroutinen kann ein asynchrones Verhalten entwickelt werden, das dem synchronen Code ähnelt. Da die Coroutine selbst keine Threads verwendet, verringert sie gleichzeitig den Aufwand für den Thread-Kontextwechsel und ist ein effizientes Entwicklungsmodell.
Beispiel: Verwendung der Coroutine-Technologie zur Entwicklung einer Webseitenzugriffsfunktion
#用协程技术开发网页访问功能 from tornado import gen #引入协程库gen from tornado.httpclient import AsyncHTTPClient import time #使用gen.coroutine修饰器 @gen.coroutine def coroutine_visit(): http_client=AsyncHTTPClient() response=yield http_client.fetch("http://www.baidu.com") print(response.body)
In diesem Beispiel wird weiterhin der asynchrone Client AsyncHTTPClient für den Seitenzugriff verwendet. Der Dekorator @gen.coroutine erklärt, dass es sich um eine Coroutine-Funktion handelt. Aufgrund des yield-Schlüsselworts ist es nicht erforderlich, eine Callback-Funktion in den Code zu schreiben, um die Zugriffsergebnisse zu verarbeiten. Stattdessen kann die Ergebnisverarbeitungsanweisung direkt nach geschrieben werden Ertragserklärung.
Da die Tornado-Coroutine auf der Grundlage des Python-Schlüsselworts yield implementiert wird, kann sie nicht direkt wie eine gewöhnliche Funktion aufgerufen werden.
Coroutine-Funktionen können auf die folgenden drei Arten aufgerufen werden:
Wird über das Schlüsselwort yield innerhalb einer Funktion aufgerufen, die selbst eine Coroutine ist.
Wenn IOLoop nicht gestartet ist, wird es über die Funktion run_sync() von IOLoop aufgerufen.
Wenn IOLoop gestartet wurde, wird es über die Funktion spawn_callback() von IOLoop aufgerufen.
Code:
#用协程技术开发网页访问功能 from tornado import gen #引入协程库gen from tornado.httpclient import AsyncHTTPClient import time #使用gen.coroutine修饰器 @gen.coroutine def coroutine_visit(): http_client=AsyncHTTPClient() response=yield http_client.fetch("http://www.baidu.com") print(response.body) @gen.coroutine def outer_coroutine(): print("start call coroutine_visit") yield coroutine_visit() print("end call coroutine_cisit")
In diesem Beispiel sind äußere_coroutine() und coroutine_visit() beides Coroutine-Funktionen Programmierfunktionen, sodass sie über das Schlüsselwort yield aufgerufen werden können. _
Code:
#用协程技术开发网页访问功能 from tornado import gen #引入协程库gen from tornado.httpclient import AsyncHTTPClient from tornado.ioloop import IOLoop #引入IOLoop对象 #使用gen.coroutine修饰器 @gen.coroutine def coroutine_visit(): http_client=AsyncHTTPClient() response=yield http_client.fetch("http://www.baidu.com") print(response.body) def func_normal(): print("start call coroutine_visit") IOLoop.current().run_sync(lambda :coroutine_visit()) print("end call coroutine_visit")
Hinweis: Die Funktion run_sync() blockiert den Aufruf der aktuellen Funktion, bis die aufgerufene Coroutine ausgeführt wird.
Tatsächlich erfordert Tornado, dass die Coroutine-Funktion im laufenden Zustand von IOLoop aufgerufen werden kann, aber die Funktion run_sync führt die Schritte zum Starten und Stoppen von IOLoop automatisch aus:
[IOLoop starten]》[Die von Lambda gekapselte Coroutine-Funktion aufrufen]》[IOLoop stoppen]
#用协程技术开发网页访问功能 from tornado import gen #引入协程库gen from tornado.httpclient import AsyncHTTPClient from tornado.ioloop import IOLoop #引入IOLoop对象 #使用gen.coroutine修饰器 @gen.coroutine def coroutine_visit(): http_client=AsyncHTTPClient() response=yield http_client.fetch("http://www.baidu.com") print(response.body) def func_normal(): print("start call coroutine_visit") IOLoop.current().spawn_callback(coroutine_visit) print("end call coroutine_visit")Die Funktion spawn_callback() wartet nicht darauf, dass die aufgerufene Coroutine die Ausführung abschließt. Alle oberen und unteren Druckanweisungen werden sofort abgeschlossen und coroutine__visit selbst wird zum entsprechenden Zeitpunkt von IOLoop aufgerufen . Hinweis: Die spawn_callback()-Funktion von IOLoop stellt Entwicklern keine Methode zum Erhalten des Rückgabewerts eines Coroutine-Funktionsaufrufs zur Verfügung, sodass Sie span_callback() nur zum Aufrufen einer Coroutine-Funktion ohne Rückgabewert verwenden können. 3. Blockierungsfunktionen in Coroutinen aufrufen
from concurrent.futures import ThreadPoolExecutor from tornado import gen #定义线程池 thread_pool=ThreadPoolExecutor(2) def mySleep(count): import time for x in range(count): time.sleep(1) @gen.coroutine def call_blocking(): print("start") yield thread_pool.submit(mySleep,10) print("end")Der Code referenziert zunächst die ThreadPoolExecutor-Klasse von concurrent.futures und instanziiert einen Thread-Pool thread_pool, der aus zwei Threads besteht. Verwenden Sie in der Coroutine call_blocking, die eine Blockierungsfunktion aufrufen muss, thread_pool.submit, um die Blockierungsfunktion aufzurufen und über yield zurückzugeben. Dies blockiert nicht die weitere Ausführung des Threads, in dem sich die Coroutine befindet, und stellt außerdem die Ausführungsreihenfolge des Codes vor und nach der Blockierungsfunktion sicher. 4. Warten auf mehrere asynchrone Aufrufe in der Coroutine
#使用列表方式传递多个异步调用 from tornado import gen #引入协程库gen from tornado.httpclient import AsyncHTTPClient @gen.coroutine #使用gen.coroutine修饰器 def coroutine_visit(): http_client=AsyncHTTPClient() list_response=yield [ http_client.fetch("http://www.baidu.com"), http_client.fetch("http://www.api.jiutouxiang.com") ] for response in list_response: print(response.body)
#使用列表方式传递多个异步调用 from tornado import gen #引入协程库gen from tornado.httpclient import AsyncHTTPClient @gen.coroutine #使用gen.coroutine修饰器 def coroutine_visit(): http_client=AsyncHTTPClient() dict_response=yield { "baidu": http_client.fetch("http://www.baidu.com"), "9siliao":http_client.fetch("http://www.api.jiutouxiang.com") } print(dict_response["baidu"].body)
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung von Tornado-Coroutinen in Python (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!