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")
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")
#使用列表方式传递多个异步调用 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!