异步-同步-在一个python事件循环中异步调用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了异步-同步-在一个python事件循环中异步调用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1749字,纯文字阅读大概需要3分钟。
内容图文
假设我有一个内部使用asyncio循环且没有异步接口的类:
class Fetcher:
_loop = None
def get_result(...):
"""
After 3 nested sync calls async tasks are finally called with *run_until_complete*
"""
...
我在内部使用asyncio的所有优点,而不必在外部代码中关心它.
但是然后我想在一个事件循环中调用3个Fetcher实例.如果我有异步def接口,那将没有问题:asyncio.gather可以帮助我.如果不支持both interfaces,真的没有其他方法可以做到吗?来吧!它使您由于一次异步使用而更改了所有项目.告诉我这不是真的.
解决方法:
Come on! It makes you change all your project because of one asyncio
usage. Tell me this is not true.
这是真的 :)
使用await关键字的整个想法是在一个事件循环中从代码的不同位置执行并发作业(这对于常规功能代码是无法做到的).
asyncio-不是某种实用程序,而是编写异步程序的整体风格.
另一方面,Python非常灵活,因此您仍然可以尝试隐藏asyncio的使用.如果您确实想要获取3个Fetcher实例的同步结果,则可以执行以下操作:
import asyncio
def sync_exec(coro):
loop = asyncio.get_event_loop()
return loop.run_until_complete(coro)
class Fetcher:
async def async_get_result(self):
# async interface:
async def async_job():
await asyncio.sleep(1)
return id(self)
return (await async_job())
def get_result(self):
# sync interface:
return sync_exec(self.async_get_result())
@classmethod
def get_results(cls, *fetchers):
# sync interface multiple:
return sync_exec(
asyncio.gather(*[fetcher.async_get_result() for fetcher in fetchers])
)
# single sync get_result:
f1 = Fetcher()
print('Result: ', f1.get_result())
# multiple sync get_result:
f2 = Fetcher()
f3 = Fetcher()
print('Results: ', Fetcher.get_results(f1, f2, f3))
输出:
Result: 2504097887120
Results: [2504097887120, 2504104854416, 2504104854136]
但是,再次重申,相信您,如果有一天继续以这种方式编写代码,您将真的后悔.如果要充分利用异步编程的优势,请使用协程并显式等待.
内容总结
以上是互联网集市为您收集整理的异步-同步-在一个python事件循环中异步调用全部内容,希望文章能够帮你解决异步-同步-在一个python事件循环中异步调用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。