Tornado 코루틴을 사용하면 동기 코드와 유사한 비동기 동작을 개발할 수 있습니다. 동시에 코루틴 자체는 스레드를 사용하지 않기 때문에 스레드 컨텍스트 전환에 따른 오버헤드를 줄여 효율적인 개발 모델입니다.
예: 코루틴 기술을 사용하여 웹 페이지 액세스 기능 개발
#用协程技术开发网页访问功能 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)
이 예에서는 비동기 클라이언트 AsyncHTTPClient가 여전히 페이지 액세스에 사용됩니다. 데코레이터 @gen.coroutine은 이것이 코루틴임을 선언합니다. 함수는 Yield 키워드의 효과로 인해 접근 결과를 처리하기 위해 코드에 콜백 함수를 작성할 필요가 없지만, 결과 처리 문은 Yield 문 바로 뒤에 작성할 수 있습니다.
토네이도 코루틴은 Python의 Yield 키워드를 기반으로 구현되어 있으므로 일반 함수처럼 직접 호출할 수 없습니다.
코루틴 함수는 다음 세 가지 방법으로 호출할 수 있습니다.
그 자체가 코루틴인 함수 내에서 Yield 키워드를 통해 호출됩니다.
IOLoop이 아직 시작되지 않은 경우 IOLoop의 run_sync() 함수를 통해 호출하세요.
IOLoop이 시작되면 IOLoop의 generate_callback() 함수를 통해 호출됩니다.
코드:
#用协程技术开发网页访问功能 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")
이 예에서는 external_coroutine()과 coroutine_visit()이 모두 코루틴 함수이므로 Yield 키워드를 통해 호출할 수 있습니다. _
코드:
#用协程技术开发网页访问功能 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")
참고: run_sync() 함수는 호출된 코루틴이 실행될 때까지 현재 함수의 호출을 차단합니다.
사실 Tornado에서는 IOLoop 실행 상태에서 코루틴 함수를 호출할 수 있어야 하지만 run_sync 함수는 IOLoop 시작 및 중지 단계를 자동으로 완료합니다. 구현 논리는
[IOloop 시작]》[Call Coroutine입니다. 람다로 캡슐화된 함수]》[IOLoop 중지]
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().spawn_callback(coroutine_visit) print("end call coroutine_visit")
spawn_callback() 함수는 호출된 코루틴이 실행될 때까지 기다리지 않습니다. 위쪽 및 아래쪽 인쇄 문은 즉시 완료되고 coroutine__visit 자체는 적절한 시간에 IOLoop에 의해 호출됩니다.
참고: IOLoop의 generate_callback() 함수는 개발자에게 코루틴 함수 호출의 반환 값을 가져오는 메서드를 제공하지 않으므로,span_callback()은 반환 값 없이 코루틴 함수를 호출하는 데에만 사용할 수 있습니다.
코드 예:
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")
코드는 먼저 Concurrent.futures의 ThreadPoolExecutor 클래스를 참조하고 두 개의 스레드로 구성된 스레드 풀 thread_pool을 인스턴스화합니다. 블로킹 함수를 호출해야 하는 코루틴 call_blocking에서 thread_pool.submit을 사용하여 블로킹 함수를 호출하고 Yield를 통해 반환합니다. 이는 코루틴이 위치한 스레드의 지속적인 실행을 차단하지 않으며, 차단 기능 전후의 코드 실행 순서도 보장합니다.
#使用列表方式传递多个异步调用 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)
여전히 @gen.coroutine 데코레이터를 사용하여 코드에서 코루틴을 정의합니다. 모든 비동기 호출만 필요한 경우 목록을 사용하여 여러 비동기 호출을 전달합니다. 모든 호출이 실행된 후 Yield가 반환되어 실행을 계속합니다. Yield는 호출 결과를 목록으로 반환합니다.
#使用列表方式传递多个异步调用 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)
위 내용은 Python에서 Tornado 코루틴 사용에 대한 자세한 설명(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!