Я пытаюсь протестировать свой http-клиент или приложение python 3.4.3, которое отправляет HTTP-запросы на сервер. Если по какой-либо причине у сервера есть задержка для ответа, я ожидаю, что запросы не должны блокироваться, поскольку asyncio + aiohttp должен обеспечивать асинхронные вызовы:
def post(self):
print("received post")
print(self.request)
print("POST Body: %s" % str(self.request.body))
time.sleep(3)
self.write("blah")
self.finish()
Мне просто интересно, почему мой код / http-клиент блокирует:
import aiohttp, asyncio, async_timeout
@asyncio.coroutine
def fetch(session, url):
with aiohttp.Timeout(30):
try:
response = yield from session.get(url)
print((yield from response.read()))
return response
except Exception as e:
raise e
finally:
try:
response.release()
except:
pass
@asyncio.coroutine
def post(session, url):
with aiohttp.Timeout(30):
try:
response = yield from session.post(url)
print((yield from response.read()))
return response
except Exception as e:
raise e
finally:
try:
response.release()
except:
pass
@asyncio.coroutine
def close_connection(session):
try:
session.close()
except:
pass
if __name__ == '__main__':
loop = asyncio.get_event_loop()
session = aiohttp.ClientSession(loop=loop)
try:
for i in range(10):
html = loop.run_until_complete(post(session, 'http://localhost:8000'))
except Exception as e:
print("received exception %s." % type(e).__name__)
# Close session if not closed.
loop.run_until_complete(close_connection(session))
Я попытался сделать цикл, в котором я перебираю 10 URL-адресов (здесь он тот же). Если бы это было последовательно, я бы ожидал, что это займет ~ 30 секунд (сервер отвечает с 3-секундной задержкой). Я ожидаю, что с асинхронным режимом потребуется меньше времени.
try:
for i in range(10):
html = loop.run_until_complete(post(session, 'http://localhost:8000'))
Блокирует ли это функция run_until_complete ()? Как сделать его неблокирующим?
loop.run_until_complete(close_connection(session))
не выполняется одновременно сloop.run_until_complete(post(session, 'http://localhost:8000'))
? - person caramel1995   schedule 30.01.2018