假设有一个进行各种数据库查询的库:
import time
def queryFoo():
time.sleep(4)
return "foo"
def queryBar():
time.sleep(4)
return "bar"
我想同时执行这两个查询,而不必添加async
到方法签名或添加装饰器。这些功能不应该完全依赖于异步。
使用asyncio
中的非异步函数的最佳方法是什么?
我在找这样的东西:
#I need an 'asyncWrapper'
results = asyncio.gather(asyncWrapper(queryFoo()), asyncWrapper(queryBar()))
提前感谢您的考虑和回复。
我想您是在追求并发性,希望不要坚持使用asyncio
模块本身,在这种情况下,这个小示例可能会有所帮助:
import asyncio
import time
from concurrent.futures import ThreadPoolExecutor
def queryFoo():
time.sleep(2)
return "FOO"
def queryBar():
time.sleep(4)
return "BAR"
with ThreadPoolExecutor(max_workers=2) as executor:
foo = executor.submit(queryFoo)
bar = executor.submit(queryBar)
results = [foo.result(), bar.result()]
print(results)
它并行运行queryFoo()
和queryBar()
,并将它们的结果收集到一个列表中,按照它们在结果的赋值中被提及的顺序排列。
如果某个函数本质上是阻塞的且不是异步的,那么在asyncio
事件循环中运行它的唯一正确方法是使用run\u in\u executor在线程中运行它:
# Our example blocking functions
import time
def queryFoo():
time.sleep(3)
return 'foo'
def queryBar():
time.sleep(3)
return 'bar'
# Run them using asyncio
import asyncio
from concurrent.futures import ThreadPoolExecutor
_executor = ThreadPoolExecutor(10)
async def in_thread(func):
loop = asyncio.get_event_loop()
return await loop.run_in_executor(_executor, func)
async def main():
results = await asyncio.gather(
in_thread(queryFoo),
in_thread(queryBar),
)
print(results)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
finally:
loop.run_until_complete(loop.shutdown_asyncgens())
loop.close()
它确实起作用。
然而,如果您想避免使用线程,唯一的方法就是将queryFoo
/queryBar
重写为本质上异步的。
问题内容: 假设有一个可以进行各种数据库查询的库: 我想同时执行这两个查询,而不必添加到方法签名或添加装饰器。这些功能完全不应该依赖于异步。 在其中利用这些非异步功能的最佳方法是什么? 我正在寻找某种形式的东西: 预先感谢您的考虑和回应。 问题答案: 如果某个函数在本质上是阻塞的而不是异步的,则在事件循环内运行该函数的唯一正确方法是使用run_in_executor在线程内运行该函数: 它确实起作
我有一个异步函数,它在代码中的某个地方按setInterval运行。此函数定期更新一些缓存。 我还有一个不同的同步函数,它需要检索值——最好是从缓存中检索,但如果是缓存未命中,则从数据源检索(我意识到以同步方式进行IO操作是不明智的,但假设在这种情况下需要这样做)。 我的问题是,我希望同步函数能够等待异步函数中的值,但是不可能在非异步函数中使用关键字: 现在,通过将中的逻辑提取到一个新的同步函数中
问题内容: 我想要实现的是Web钩子应该等待,直到我从api调用获得响应为止。PS:API正在起作用,只是机器人不等待响应到来。任何帮助将不胜感激。谢谢 问题答案: 您没有说明要在什么环境中运行,但是鉴于您的代码以及上面概述的更改,我可以使用Firebase Cloud Functions和node.js 6.14复制您的问题。 我可以通过使用包而不是来使它正常工作。顾名思义,它使用本机Promi
问题内容: 我试图将两个异步函数链接在一起,因为第一个具有条件返回参数,导致第二个运行或退出模块。但是,我发现规格中找不到奇怪的行为。 这是我的代码的混帐摘要(您可以在此处查看完整的范围),该代码只是检查玩家是否已经在大厅中,但这无关紧要。 接下来,我们有这个异步功能。 如果,则无需运行此功能。 我试着做 我希望这将等待结果,以便可以有条件地运行,但是我收到了没有具体细节的类型错误。 为什么您不能
问题内容: 我想使用生成器yield和async函数。我阅读了本主题,并编写了以下代码: 但是我得到了错误: 语法错误:异步函数中的“ yield” 如何在异步功能中使用良率生成器? 问题答案: 更新: 从Python 3.6开始,我们有了异步生成器,能够直接在协程内部使用。 Python 3.5的旧答案: 您不能在协程内部。唯一的方法是使用/ magic方法手动实现异步迭代器。在您的情况下: 输
问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做