【问题标题】:python 3.8 Future is returned instead of value when awaited等待时返回python 3.8 Future而不是值
【发布时间】:2021-07-29 17:40:29
【问题描述】:

我遇到了 python 3.8.5 与 3.7 的问题

给定方法:

import asyncio
import functools

_executor = ThreadPoolExecutor()


async def request_async(*args, **kwargs) -> requests.Response:
    loop = asyncio.get_event_loop()
    response = await loop.run_in_executor(_executor, functools.partial(requests.request, *args, **kwargs))
    return response

还有一个电话:

 response = await request_async(protocol, url, headers=headers, *args, **kwargs)

^^ 在 python 3.7 中工作并根据签名返回 Response 尽管在 python 3.8 中返回一个 Future 才能开始工作,但需要第二次等待。

 response = await (await request_async(protocol, url, headers=headers, *args, **kwargs))

我希望能提供一些见解,看看哪里以及为什么会发生。

【问题讨论】:

  • 您好,我正在尝试重现您的问题,但我遇到了一些麻烦,因为您提供的示例代码无法执行。我想它需要from concurrent.futures import ThreadPoolExecutor,但你的request_async 也引用requests,我一直无法弄清楚那应该是什么。你能编辑你的代码来纠正它吗?
  • +1 致@OmnipotentEntity - 例如:你不是在使用等待的aiohttp 请求吗?顺便提一句。为什么不直接使用aiohttp请求?

标签: python python-asyncio python-3.7 python-3.8


【解决方案1】:

此代码在 python 3.8.5 和 python 3.7.8 中产生相同的输出:

import asyncio
import functools
import requests
from concurrent.futures import ThreadPoolExecutor 

_executor = ThreadPoolExecutor()

async def request_async(*args, **kwargs) -> requests.Response:
  loop = asyncio.get_event_loop()
  response = await loop.run_in_executor(_executor, functools.partial(requests.request, *args, **kwargs))
  return response

loop = asyncio.get_event_loop()
req_result = loop.run_until_complete(request_async('GET', "http://example.com/"))
loop.close()

print(req_result)

请注意,变量req_result 使用get_event_loop 在非异步环境中执行异步函数的评估。有关为什么需要这样做的更多详细信息,请参阅此 Stack Overflow 答案:How does asyncio actually work?

不幸的是,按照结构化,您的问题没有提供足够的信息来回答您关于两个版本之间的差异以及为什么会出现差异的具体观点。可能只是在其他异步上下文中评估惰性表达式(例如异步函数)时(可能从 repl 或在调试器中查看数据)有所不同。但这只是一个即兴猜测。但是由于您在问题中调用异步函数的方式,我认为这个答案对您来说更有价值,因为它回答了您的隐含问题(“我如何让它工作?”)而不是您的明确问题(“为什么版本之间存在这种差异?”)。

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2020-03-13
    • 2022-01-16
    • 2018-05-16
    相关资源
    最近更新 更多