当前位置: 首页 > 知识库问答 >
问题:

Python3.5Async/await与真实代码示例

仲孙飞文
2023-03-14

我已经阅读了大量关于Python 3.5异步/等待的文章和教程。我不得不说我很困惑,因为有些人使用get_event_loop()并运行_直到_complete(),有些人使用sure_future(),有些人使用asyncio.wait(),还有一些人使用call_soon()。

看起来我有很多选择,但我不知道它们是否完全相同,或者有些情况下使用循环,有些情况下使用wait()。

但问题是,所有示例都使用asyncio.sleep()模拟返回等待对象的真正慢速操作。一旦我试图用这行代码替换一些真正的代码,整个事情就失败了。上面写的方法之间的区别是什么?我应该如何运行一个还没有准备好异步/等待的第三方库。我确实使用Quandl服务获取一些股票数据。

 import asyncio
 import quandl

 async def slow_operation(n):
     # await asyncio.sleep(1) # Works because it's await ready.
     await quandl.Dataset(n) # Doesn't work because it's not await ready.


 async def main():
     await asyncio.wait([
         slow_operation("SIX/US9884981013EUR4"),
         slow_operation("SIX/US88160R1014EUR4"),
     ])

 # You don't have to use any code for 50 requests/day.
 quandl.ApiConfig.api_key = "MY_SECRET_CODE"

 loop = asyncio.get_event_loop()
 loop.run_until_complete(main())

我希望你明白我有多失落,我想有多简单的事情并行运行。

共有2个答案

丁阎宝
2023-03-14

您可以从这里查看以下简单的工作示例。顺便说一下,它返回一个值得读取的字符串:-)

import aiohttp
import asyncio

async def fetch(client):
  async with client.get('https://docs.aiohttp.org/en/stable/client_reference.html') as resp:
    assert resp.status == 200
    return await resp.text()

async def main():
  async with aiohttp.ClientSession() as client:
    html = await fetch(client)
    print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
闻华容
2023-03-14

如果第三方库与async/wait不兼容,那么显然您不能轻松使用它。有两种情况:

>

def fn(..., clb):
    ...

所以你可以这样做:

def on_result(...):
    ...

fn(..., on_result)

在这种情况下,您可以将这些函数包装到异步协议中,如下所示:

from asyncio import Future

def wrapper(...):
    future = Future()
    def my_clb(...):
        future.set_result(xyz)
    fn(..., my_clb)
    return future

(使用future.set_异常(exc)on异常)

然后,您可以使用await在一些async函数中调用该包装器:

value = await wrapper(...)

请注意,wait适用于任何Future对象。您不必将包装器声明为async

如果库中的函数是同步的,那么您可以在一个单独的线程中运行它(可能您会为此使用一些线程池)。整个代码可能看起来像这样:

import asyncio
import time
from concurrent.futures import ThreadPoolExecutor

# Initialize 10 threads
THREAD_POOL = ThreadPoolExecutor(10)

def synchronous_handler(param1, ...):
    # Do something synchronous
    time.sleep(2)
    return "foo"

# Somewhere else
async def main():
    loop = asyncio.get_event_loop()
    futures = [
        loop.run_in_executor(THREAD_POOL, synchronous_handler, param1, ...),
        loop.run_in_executor(THREAD_POOL, synchronous_handler, param1, ...),
        loop.run_in_executor(THREAD_POOL, synchronous_handler, param1, ...),
    ]
    await asyncio.wait(futures)
    for future in futures:
        print(future.result())

with THREAD_POOL:
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

如果出于某种原因不能使用线程,那么使用这样的库只会使整个异步代码毫无意义。

但是请注意,将同步库与异步一起使用可能是个坏主意。你不会得到很多,但是你会使代码复杂化很多。

 类似资料:
  • 笔者在很长一段时间内都使用 koa@1 +(generator|bluebird)+ sequelize 这个组合,这个组合并没有什么问题,也很常见,但是到了滥用的地步,导致后来维护和调试起来都很痛苦。若排除 sequelize 这个我们不得不用的模块,从调试 cpuprofile 角度讲讲为什么笔者认为应该用 async/await + Promise 替代 co + generator|blu

  • 本文向大家介绍Android震动与提示音实现代码,包括了Android震动与提示音实现代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了android消息提示的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 以封装为例,我可以想到用户和手机之间的交互。用户不需要知道手机的内部工作情况就可以进行操作,因此这称为抽象。但是封装在这个例子中的什么地方呢?有人能解释一下吗?

  • 本文向大家介绍php base64 编码与解码实例代码,包括了php base64 编码与解码实例代码的使用技巧和注意事项,需要的朋友参考一下 php base64 编码与解码详解 1.自定义规则方式编码和解码 实例 2.利用系统函数完成base64位的编码和解码 实例代码: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 鉴于每个用户的使用习惯问题,EasySwoole本身并不提供封装好的数据库操作与Model层,但我们强力推荐在项目中使用第三方开源库https://github.com/joshcam/PHP-MySQLi-Database-Class 作为数据操作类库,并构建自己的Model。 使用指导 项目引入 克隆(下载)MySQLi项目,并解压提取其中的MysqliDb.php文件,放入项目 ‘/App/

  • 本文向大家介绍Python中字符串与编码示例代码,包括了Python中字符串与编码示例代码的使用技巧和注意事项,需要的朋友参考一下 在最新的Python 3版本中,字符串是以Unicode编码的,即Python的字符串支持多语言 编码和解码    字符串在内存中以Unicode表示,在操作字符串时,经常需要str和bytes互相转换    如果在网络上传输或保存到磁盘上,则从内存读到的数据就是st