- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
自 Python 3.5 起,关键字 await
和 async
被引入该语言。现在,我更像是一个 Python 2.7 的人,而且我已经有一段时间避免使用 Python 3,所以 asyncio
对我来说很陌生。据我了解,await/async
的工作方式似乎与它们在 ES6(或 JavaScript、ES2015,无论您如何调用它)中的工作方式非常相似。
这是我制作的两个脚本来比较它们。
import asyncio
async def countdown(n):
while n > 0:
print(n)
n -= 1
await asyncio.sleep(1)
async def main():
"""Main, executed in an event loop"""
# Creates two countdowns
futures = asyncio.gather(
countdown(3),
countdown(2)
)
# Wait for all of them to finish
await futures
# Exit the app
loop.stop()
loop = asyncio.get_event_loop()
asyncio.ensure_future(main())
loop.run_forever()
function sleep(n){
// ES6 does not provide native sleep method with promise support
return new Promise(res => setTimeout(res, n * 1000));
}
async function countdown(n){
while(n > 0){
console.log(n);
n -= 1;
await sleep(1);
}
}
async function main(){
// Creates two promises
var promises = Promise.all([
countdown(3),
countdown(2)
]);
// Wait for all of them to finish
await promises;
// Cannot stop interpreter's event loop
}
main();
需要注意的一件事是代码非常相似,而且它们的工作方式几乎相同。
问题如下:
在 Python 和 ES6 中,await/async
都是基于生成器的。认为 Future 与 Promises 相同是否正确?
我在asyncio
文档中看到了术语Task
、Future
和Coroutine
。它们之间有什么区别?
我应该开始编写始终运行事件循环的 Python 代码吗?
最佳答案
- In both Python and ES6,
await/async
are based on generators. Is it a correct to think Futures are the same as Promises?
不是Future
,而是Python的Task
大致相当于Javascript的Promise
。请参阅下面的更多详细信息。
- I have seen the terms
Task
,Future
andCoroutine
used in theasyncio
documentation. What are the differences between them?
它们是完全不同的概念。 Task
主要由Future
和Coroutine
组成。让我们简要描述一下这些原语(我将简化很多事情以仅描述主要原理):
future
Future 只是对值的抽象,可能尚未计算但最终可用。这是一个只做一件事的简单容器 - 每当设置值时,触发所有已注册的回调。
如果您想获得该值,您可以通过 add_done_callback()
方法注册一个回调。
但与 Promise
不同的是,实际的计算是在外部完成的 - 外部代码必须调用 set_result()
方法来解决 future 的问题。
协程
Coroutine 是非常类似于Generator
的对象。
生成器通常在 for
循环中迭代。它产生值并且从PEP342开始接受,它接收值。
协程通常在 asyncio
库的深处的事件循环中迭代。协程产生 Future
实例。当你迭代一个协程并产生一个 future 时,你应该等到这个 future 被解决。之后,您应将 future 的值发送
到协程中,然后您将收到另一个 future,依此类推。
await
表达式实际上与 yield from
表达式相同,因此通过等待 其他协程,您可以停止,直到该协程拥有所有 future resolved,得到协程的返回值。 Future
是一次可迭代的,它的迭代器返回实际的 Future - 这大致意味着 await future
等于 yield from future
等于 yield future
。
任务
Task 是实际开始计算并附加到事件循环的 Future。所以它是一种特殊的 Future(类 Task
派生自类 Future
),它与一些事件循环相关联,并且它有一些协程,用作 任务执行器。
任务通常由事件循环对象创建:你给循环一个协程,它创建任务对象并开始以上述方式迭代该协程。协程完成后,Task 的 Future 由协程的返回值解决。
你看,任务与 JS Promise 非常相似 - 它封装了后台作业及其结果。
协程函数和异步函数
Coroutine func 是一个协程工厂,就像生成器函数之于生成器。请注意 Python 的协程函数和 Javascript 的异步函数之间的区别 - JS 异步函数在被调用时会创建一个 Promise 并且其内部生成器会立即开始迭代,而 Python 的协程什么都不做,直到在其上创建任务。
- Should I start writing Python code that always has an event loop running?
如果您需要任何 asyncio 功能,那么您应该这样做。事实证明,很难混契约(Contract)步和异步代码——你的整个程序最好是异步的(但你可以通过 asyncio 线程池 API 在单独的线程中启动同步代码块)
关于javascript - Python3 中的 Futures 和 ES6 中的 Promises 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47493369/
在 settings.py LANGUAGE_CODE = 'es-mx'或 LANGUAGE_CODE = 'es-ar'不起作用,但是 LANGUAGE_CODE = 'es'或 LANGUAGE
我想知道OpenGL ES 2.0和OpenGL ES 3.0之间有什么区别。 OpenGL ES 3.0的主要优点是什么? 最佳答案 总体而言,这些变化通过更大的缓冲区、更多的格式、更多的统一等提高
这是我为此端点使用 Postman localhost:9201/response_v2_862875ee3a88a6d09c95bdbda029ce2b/_search 的请求正文 { "_sour
OpenGL ES 2.0 没有 ES 1.0 那样的 GL_POINT_SMOOTH 定义。这意味着我用来绘制圆圈的代码不再有效: glEnable(GL_POINT_SMOOTH); glPoin
我尝试编译这个着色器: varying vec2 TexCoords; varying vec4 color; uniform sampler2D text; uniform vec3 textCol
我是 OpenGL ES 的新手,我使用的是 OpenGL ES 2.0 版本。我可以在片段着色器中使用按位操作(右移、左移)吗? 最佳答案 OpenGL ES 2.0 没有按位运算符。 ES 3.0
有没有办法只用线画一个三角形? 我认为GL_TRIANGLES选项可使三角形充满颜色。 最佳答案 使用glPolygonMode(face, model)设置填充模式: glPolygonMode(G
我想用一个包含 yuv 数据的采样器在 opengl es 着色器中将 yuv 转换为 rgb。我的代码如下: 1)我将 yuv 数据发送到纹理: GLES20.glTexImage2D(GLES20
我正在使用这样的域: http://www.domain.com/es/blabla.html 我想更改 .es 的/es 部分并将 URLS 转换为类似以下内容: http://www.domain
有谁知道OpenGL ES是否支持GL_TEXTURE_RECTANGLE?我计划将它用于 2D 图形以支持非二次幂图像。我当前的实现使用 alpha=0 填充的 POT 纹理,对于拉伸(stretc
我需要在具有 PowerVR SGX 硬件的 ARM 设备上实现离屏纹理渲染。 一切都完成了(使用了像素缓冲区和 OpenGL ES 2.0 API)。唯一 Unresolved 问题是速度很慢glR
这是一个奇怪的事情。我有一个片段着色器,据我所知只能返回黑色或红色,但它将像素渲染为白色。如果我删除一根特定的线,它会返回我期望的颜色。它适用于 WebGL,但不适用于 Raspberry Pi 上的
我正在考虑将一些 OpenGL 代码移植到 OpenGL ES 并且想知道这段代码到底做了什么: glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) 因为 g
我正在考虑将一些 OpenGL 代码移植到 OpenGL ES 并且想知道这段代码到底做了什么: glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) 因为 g
GLSL ES最多可以编译多少个程序?所以假设我创建了 100 个片段着色器,每个都有不同的效果。所以在运行时我编译所有这些并动态地我用 glUseProgram 交换它们。我假设每次我编译一个新的
我正在尝试使用顶点缓冲区对象来绘制圆,并在 iPhone 上的 OpenGL ES 2.0 中启用 GL_POINT_SMOOTH 来绘制点。 我使用以下 ES 1.0 渲染代码在 iPhone 4
为什么在 OpenGL ES 1.x 中缩放(均匀)对象会导致对象变轻? 更有意义的是它会更暗,因为法线被缩小是否也会使对象更暗?但由于某种原因,物体变轻了。当我放大时,对象变得更暗。在我看来,这应该
我正在尝试通过移植 some code 在 iOS 上的 OpenGL ES 2.0 中获得一些阴影效果。来自标准 GL。部分示例涉及将深度缓冲区复制到纹理: glBindTexture(GL_TEX
所以我正在使用 2D 骨骼动画系统。 有 X 个骨骼,每个骨骼至少有 1 个部分(一个四边形,两个三角形)。平均而言,我可能有 20 块骨头和 30 个部分。大多数骨骼都依赖于父骨骼,骨骼会每帧移动。
我在使用 ES 着色器时遇到了一些晦涩难懂的问题,而且我现在几乎没有想法了。 这是一些代码: .. precision mediump float; .. #define STEP (1f/6f) 5
我是一名优秀的程序员,十分优秀!