首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中对非异步函数使用asyncio?

在Python中对非异步函数使用asyncio?
EN

Stack Overflow用户
提问于 2018-06-27 03:41:47
回答 2查看 14.3K关注 0票数 9

假设有一个库可以执行各种数据库查询:

代码语言:javascript
复制
import time

def queryFoo():
    time.sleep(4)
    return "foo"

def queryBar():
    time.sleep(4)
    return "bar"

我希望同时执行这两个查询,而不必将async添加到方法签名或添加装饰器。这些函数根本不应该依赖于asyncio。

asyncio**?**中利用这些非异步功能的最佳方式是什么?

我正在寻找某种形式的东西:

代码语言:javascript
复制
#I need an 'asyncWrapper'

results = asyncio.gather(asyncWrapper(queryFoo()), asyncWrapper(queryBar()))

提前感谢您的考虑和回复。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-27 06:07:09

如果某些函数是阻塞函数且本质上不是异步的,那么在asyncio事件循环中运行它的唯一合适方法就是使用run_in_executor在线程中运行它

代码语言:javascript
复制
# 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,使其本质上是异步的。

票数 12
EN

Stack Overflow用户

发布于 2018-06-27 05:35:08

我假设您追求的是并发性,希望不要坚持使用asyncio模块本身,在这种情况下,这个小示例可能会有所帮助:

代码语言:javascript
复制
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(),并将它们的结果按照它们在分配给results的任务中提到的顺序收集到一个列表中。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51050315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档