gpt4 book ai didi

Python 的 asyncio 是同步工作的

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:47 24 4
gpt4 key购买 nike

我正在尝试利用 Python 的新 asyncio 库来发送异步 HTTP 请求。我想在发送每个请求之前等待几毫秒(timeout 变量) - 当然 - 异步发送它们,而不是在发送每个请求后等待响应。

我正在做类似下面的事情:

@asyncio.coroutine
def handle_line(self, line, destination):
print("Inside! line {} destination {}".format(line, destination))
response = yield from aiohttp.request('POST', destination, data=line,
headers=tester.headers)
print(response.status)
return (yield from response.read())

@asyncio.coroutine
def send_data(self, filename, timeout):
destination='foo'
logging.log(logging.DEBUG, 'sending_data')
with open(filename) as log_file:
for line in log_file:
try:
json_event = json.loads(line)
except ValueError as e:
print("Error parsing json event")
time.sleep(timeout)
yield from asyncio.async(self.handle_line(json.dumps(json_event), destination))


loop=asyncio.get_event_loop().run_until_complete(send_data('foo.txt', 1))

我得到的输出(通过打印 200 个响应)看起来这段代码正在同步运行。我做错了什么?

最佳答案

这里有几个问题:

  1. 你应该使用 asyncio.sleep ,而不是 time.sleep,因为后者会阻塞事件循环。

  2. 您不应该在 asyncio.async(self.handle_line(...)) 调用之后使用 yield from,因为这会使脚本 block ,直到 self.handle_line 协程完成,这意味着您最终不会并发执行任何操作;您处理每一行,等待处理完成,然后继续下一行。相反,您应该不等待地运行所有 asyncio.async 调用,将返回的 Task 对象保存到列表中,然后使用 asyncio.wait一旦你开始了它们,等待它们全部完成。

综合起来:

@asyncio.coroutine
def handle_line(self, line, destination):
print("Inside! line {} destination {}".format(line, destination))
response = yield from aiohttp.request('POST', destination, data=line,
headers=tester.headers)
print(response.status)
return (yield from response.read())

@asyncio.coroutine
def send_data(self, filename, timeout):
destination='foo'
logging.log(logging.DEBUG, 'sending_data')
tasks = []
with open(filename) as log_file:
for line in log_file:
try:
json_event = json.loads(line)
except ValueError as e:
print("Error parsing json event")
yield from asyncio.sleep(timeout)
tasks.append(asyncio.async(
self.handle_line(json.dumps(json_event), destination))
yield from asyncio.wait(tasks)


asyncio.get_event_loop().run_until_complete(send_data('foo.txt', 1))

关于Python 的 asyncio 是同步工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29457394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com