【问题标题】:How asynchronous system in python work?python中的异步系统如何工作?
【发布时间】:2018-09-03 18:54:01
【问题描述】:

我有一个新项目,我计划将aiohttpuWSGI 一起使用。我发现 uWSGI 通过greentlet 支持 asyncio。我还对 greenlet 进行了一些研究,发现它也提供了event loop。所以作为 python 的新手(来自 Node.js 世界)。我有几个关于 python 异步编程的问题。

如果 asyncio 提供事件循环,为什么我必须使用 greenlet 作为挂起/恢复引擎来将 aiohttp 与 uWSGI 集成? asyncio 不提供挂起/恢复引擎?

为了让 pyhton 像 Node.js 系统一样工作,它需要使用组合循环引擎、挂起/恢复引擎和 I/O 引擎(就像 Node.js 使用 libuv)?

我看了一下这个Differences between gevent and tornado ,答案提到它们是不同的。正如答案所说,gevent 使用协程,asyncio 也提供协程,这是否意味着 gevent 使用与 asyncio 相同的技术?

greenlet 和 asyncio 可以互换使用吗?还是两者都用?

【问题讨论】:

    标签: python uwsgi python-asyncio gevent


    【解决方案1】:

    如果 asyncio 提供事件循环,为什么我必须使用 greenlet 作为挂起/恢复引擎来将 aiohttp 与 uWSGI 集成? asyncio 不提供挂起/恢复引擎?

    Asyncio 确实提供了一个带有可挂起协程的事件循环,但 uWSGI 是一个复杂的库,实际上早于 asyncio。 Asyncio 的挂起/恢复基于 Python 3 async/await,必须使用 across the board 才能使库与 asyncio 兼容。 (aiohttp就是这样一个库的一个例子,还有many others。)

    cost of some portabilitygreenlet 允许暂停任意同步代码,这使其成为桥接 uwsgi 和 asyncio 的完美低成本解决方案。

    正如答案所说,gevent 使用协程,asyncio 也提供协程,这是否意味着 gevent 使用与 asyncio 相同的技术?

    gevent also uses greenlets 在基于异步回调的系统之上提供类似顺序的编程体验。虽然 asyncio 实现了相同的目标,但它使用完全不同的底层机制来实现,这会禁止运行为另一个编写的代码。两者可能会被桥接,但不要期望为 asyncio 编写的代码在 gevent 下“正常工作”,反之亦然。

    greenlet 和 asyncio 可以互换使用吗?还是两者都用?

    两者在不同级别上工作:greenlet 提供可挂起的协程,没有异步事件循环,可与 Python 3 的 async/await 相媲美。 Asyncio 实现了一个用于异步编程的工具箱,其中包括一个支持传输和套接字的事件循环、一个协程调度程序以及一个 Future 的实现,以与经典的基于回调的编程集成。因此,您可以将 asyncio 与 gevent 进行比较,而不是与 greenlet 进行比较。

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 2010-12-17
      • 2011-05-02
      • 2012-06-02
      相关资源
      最近更新 更多