【问题标题】:Can I skip "async def" in a function in Python 3.5?我可以在 Python 3.5 的函数中跳过“async def”吗?
【发布时间】:2018-01-29 09:56:56
【问题描述】:

我可以跳过 Python 3.5 函数中的 async def 关键字,而我的代码仍然可以异步工作吗?

类似这样的:

async def sleep():
    await asyncio.sleep(1)

def mysleep():
    loop = asyncio.get_event_loop()
    loop.await(sleep)

def main():
    mysleep()

【问题讨论】:

  • 不,不可能。
  • @Sraw 你能详细说明一下吗?
  • 自己试试吧。 Python 非常适合进行实验,这要归功于它的 REPL。
  • 是的,简单地将loop.await(sleep) 替换为loop.run_until_complete(sleep())

标签: python asynchronous python-asyncio


【解决方案1】:

正如文森特所注意到的,如果您像这样更改代码,它将正常工作:

import asyncio


async def sleep():
    await asyncio.sleep(1)

def mysleep():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(sleep())

def main():
    mysleep()


if __name__ == '__main__':
    main()

但这是否意味着它异步工作?

答案是——它仅在 mysleep() 函数内异步工作(并且可以在那里获得相关的 benefit),但它会阻止 mysleep() 之外的所有内容。这意味着mysleep() 本身或任何外部代码不能与其他异步函数一起异步运行。

为避免这种情况,您应该在最可能的外部范围内运行事件循环:使事件循环从程序的入口点开始。这将使在这个单一事件循环中异步运行所有内容成为可能。

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多