Python3 写异步 IO 方便吗?跟 NodeJS 比,有哪些不足之处。

2021-08-23 17:36:34 +08:00
 balabalaguguji

最近了解了下 Python3 的 async/await 用起来跟 NodeJS 的差不多,找到的异步 Redis 和 Mongodb 库都还不错。

发现 requests 没有异步,想找个替代的,aiohttp 的语法太奇怪了,如下,得先创建一个 session,然后 xxx,写起来很是麻烦,特别是要把以前的同步代码改为异步的,突然想要放弃。

import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        pokemon_url = 'https://pokeapi.co/api/v2/pokemon/151'
        async with session.get(pokemon_url) as resp:
            pokemon = await resp.json()
            print(pokemon['name'])

asyncio.run(main())

NodeJS 的 Promise 就非常爽,没有异步的自己包装下就好了,像 sleep 。

3458 次点击
所在节点    程序员
34 条回复
qW7bo2FbzbC0
2021-08-24 10:01:17 +08:00
@crclz #16 最新的 HTTPClient 不是自带 async 方法了吗
Nich0la5
2021-08-24 10:12:54 +08:00
python 异步几个蛋疼的点 await 传染,具体的异步实现依赖于第三方库而且场景覆盖不全,像 aiohttp aiofile 一直有海量 bug,( httpx 相对好一些维护的人比较多),自己从头撸一个异步库又要从底开始太麻烦了,我就是嫌麻烦才用 py 的。我自己写的时候经常是线程协程混写,只有明显协程性能占优的场景才用。

至于你说的 session 问题,request 也有,而且推荐这种写法,你可以自己测下性能,复用 session 和不带的差距还是很大的
wangyzj
2021-08-24 10:23:01 +08:00
天生异步和假异步
python 不是干这个的
能写而已
zzlhr
2021-08-24 10:26:25 +08:00
python 写轮询 http 都能假死。。。
enrolls
2021-08-24 11:38:28 +08:00
使用 3.9 版本,語法會變簡單。或者試試
enrolls
2021-08-24 11:38:49 +08:00
使用 3.9 版本,語法會變簡單。或者試試 curio
mmdsun
2021-08-24 13:17:27 +08:00
async/await 还是 C sharp 最舒服。

其他语言有 async/await 但没学到 C#异步的精髓。
meiyoumingzi6
2021-08-24 20:36:02 +08:00
主要还是生态吧, 感觉写起来好点, 单还是不太爽
还是 golang 写异步爽的起飞
Trim21
2021-08-24 23:18:34 +08:00
如果你要替换 requests 的话应可以用 httpx.AsyncClient,基本上就是把 requests.Session 的 http 请求换成了异步的。

如果是长时间运行的服务的话本来就不应该用 requests.get ,应该整个程序初始化一个或者多个 requests.Session,然后复用 session,跟 aiohttp 强制你要做的事情是差不多的,aiohttp 的文档里面也提到了不要每次请求都创建一个 session
lewinlan
2021-08-25 02:29:48 +08:00
都 2021 年了,还写 py,放过自己好吗?
balabalaguguji
2021-08-25 09:04:19 +08:00
@Trim21 #29 好的,多谢。我的连接都是一次一个的,似乎没必要保持一个 session
molika
2021-08-25 09:15:53 +08:00
习惯就好了 ~ 可能需要注意的就是各种三方库了 好多都是同步的。要自己 hack 打补丁 很痛苦。
gitopen
2021-08-25 09:26:42 +08:00
@lewinlan 不写 py,写啥
balabalaguguji
2021-08-25 09:58:09 +08:00
@molika #32 想想还是放弃了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/797526

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX