【发布时间】:2021-10-11 17:51:28
【问题描述】:
从 Javascript 迁移到 Python,看着 asyncio 让我有点困惑。
作为一个对并发基本概念不熟悉的人,我只是假设对 Javascript 并发的理解很肤浅。
在Javascript中使用async / await的基本理解:
如果我们在 async 函数内运行任何进程,并且 await 是函数的响应,我们实际上是在等待函数在 Promise 上设置值。
完全有意义 - 当Promise 被赋予一个值时,我们还可以使用诸如.then() 之类的回调来处理响应。或者,只需await。
无论这里异步的底层实现是什么(例如,所有进程都运行在带有事件循环的单个线程上),我们如何与之交互是否重要?
现在,我转向 Python 并开始使用 asyncio。我们有Futures,就像Promises。一下子就不能使用我的标准库了,比如request.get(...),但是我需要在库中使用非阻塞网络请求比如aiohttp。
这里的阻塞/非阻塞是什么意思?我假设这意味着事件循环所在的单个线程被阻塞,所以我们不能并行处理其他函数。
那么我的两个问题是:
- 单线程阻塞的原因是什么?例如
requests.get(...) - 为什么大多数函数在 Javascript 中是非阻塞的,而在 Python 中却不是(即我们不需要特定的库,例如
aiohttp)。
那么像Go 这样的语言和它们的goroutines 呢?是否只是一个案例,因为它是一种从一开始就内置并发的新语言,阻塞函数的概念不存在。或者在 Go 中它不是单线程,所以一切都可以本质上并行化?
谢谢:)
【问题讨论】:
-
据我了解,JavaScript 的阻塞函数可能要少得多,因为它是单线程的,非异步函数中的阻塞函数会冻结整个页面,直到它们完成
-
@VilgotanL 如果他们自己执行的时间过长(例如函数内部的同步大数据处理),他们也可以冻结整个页面
-
请记住,
async / await是在 2017 年才添加到 Javascript 中的。它们并不是从一开始就被融入到语言中的。 -
@TimRoberts:也就是说,事件循环(这是您实现它们所需要的) 从一开始就被嵌入; Python 没有。
标签: javascript python multithreading async-await python-asyncio