docs는 ClientSession을 다시 사용한다고 말합니다.aiohttp ClientSession 풀을 다시 사용하는 방법은 무엇입니까?
요청 당 세션을 만들지 마십시오. 모든 요청을 모두 수행하는 응용 프로그램 당 세션이 필요할 가능성이 큽니다.
세션에 연결 풀이 포함되어 있고 연결 재사용 및 연결 유지 (둘 다 기본적으로 설정되어 있음)로 인해 총 성능이 향상 될 수 있습니다. 1
그러나이 작업을 수행하는 방법에 대한 문서에는 아무런 설명이없는 것 같습니다. 어쩌면 관련성이있는 한 가지 예가 있지만 다른 곳에서 풀을 재사용하는 방법을 보여주지는 못합니다 : http://aiohttp.readthedocs.io/en/stable/client.html#keep-alive-connection-pooling-and-cookie-sharing
이렇게하는 것이 올바른 방법일까요?
1)
인스턴스 ClientSession
의 한 세션 객체입니다
@app.listener('before_server_start')
async def before_server_start(app, loop):
app.pg_pool = await asyncpg.create_pool(**DB_CONFIG, loop=loop, max_size=100)
app.http_session_pool = aiohttp.ClientSession()
@app.listener('after_server_stop')
async def after_server_stop(app, loop):
app.http_session_pool.close()
app.pg_pool.close()
@app.post("/api/register")
async def register(request):
# json validation
async with app.pg_pool.acquire() as pg:
await pg.execute() # create unactivated user in db
async with app.http_session_pool as session:
# TODO send activation email using SES API
async with session.post('http://httpbin.org/post', data=b'data') as resp:
print(resp.status)
print(await resp.text())
return HTTPResponse(status=204)
3)에 추가하기 만하면 SSL (https?)을 사용하는 경우 0.25 초가 사용됩니다. 또한 물어보기가 싫지만 다른 곳에서 '__aenter__/__aexit__'에 대한 설명을 찾지 못했습니다 ... 어떻게 다른지 설명해 주시겠습니까? (그들은 단지 @ asyncio.coroutine 데코레이터가있는 포장지처럼 보입니다.) – dtgq
@dtgq'__aenter__' /'__aexit__'에 대한 정보를 추가하여 답변을 업데이트했습니다. 0.25 초가되면 - 예, https URL을 요청할 수 있다고 생각한다면 이해가됩니다. –