- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是 gevents 和 greenlets 的新手。我找到了一些关于如何使用它们的好文档,但没有一个给我说明我应该如何以及何时使用 greenlets!
我不确定的是,如果它们基本上是协同例程,它们如何为我们提供并发性。
最佳答案
Greenlets 提供并发但不并行。并发是指代码可以独立于其他代码运行。并行性是同时执行并发代码。当用户空间中有很多工作要做时,并行性特别有用,这通常是 CPU 密集型的东西。并发对于分解问题很有用,可以更轻松地并行调度和管理不同的部分。
Greenlets 在网络编程中非常出色,其中与一个套接字的交互可以独立于与其他套接字的交互发生。这是并发的经典例子。因为每个 greenlet 在其自己的上下文中运行,您可以继续使用同步 API 而无需线程。这很好,因为线程在虚拟内存和内核开销方面非常昂贵,因此您可以使用线程实现的并发性要少得多。此外,由于 GIL,Python 中的线程比平常更昂贵且更受限制。并发的替代方案通常是 Twisted、libevent、libuv、node.js 等项目,其中所有代码共享相同的执行上下文,并注册事件处理程序。
使用 greenlet(通过 gevent 等适当的网络支持)来编写代理是一个好主意,因为您对请求的处理能够独立执行并且应该这样编写。
出于我之前给出的原因,Greenlets 提供了并发性。并发不是并行。通过隐藏事件注册并在通常会阻塞当前线程的调用上为您执行调度,像 gevent 这样的项目可以在不需要更改异步 API 的情况下公开这种并发性,并且显着降低系统成本。
关于python - 格林莱特VS。线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15556718/
我是一名优秀的程序员,十分优秀!