【问题标题】:Eventlet or gevent or Stackless + Twisted, Pylons, Django and SQL AlchemyEventlet 或 gevent 或 Stackless + Twisted、Pylons、Django 和 SQL Alchemy
【发布时间】:2011-03-04 03:27:49
【问题描述】:

我们将 Twisted 广泛用于需要大量异步 io 的应用程序。在某些情况下,东西是受 cpu 限制的,为此我们产生了一个进程池来完成工作,并拥有一个跨多个服务器管理这些进程的系统——所有这些都在 Twisted 中完成。效果很好。问题是很难让新的团队成员跟上进度。在 Twisted 中编写异步代码需要接近垂直的学习曲线。就好像人类天生就不会那样想。

我们可能正在考虑采用混合方法。也许将 xmlrpc 服务器部分和进程管理保留在 Twisted 中,并在代码中实现其他内容,至少在某种程度上看起来是同步的,而不是同步的。再说一次,我喜欢显式而不是隐式,所以我必须多考虑一下。无论如何到greenlets - 这些东西的效果如何?所以有 Stackless,正如你从我的盖伦特化身中看到的那样,我很清楚它在 CCP 的旗舰 EVE Online 游戏中的第一手使用取得了巨大成功。 Eventlet 或 gevent 呢?好吧,目前只有 Eventlet 与 Twisted 一起工作。然而,gevent 声称更快,因为它不是纯 python 实现,而是依赖于 libevent。它还声称具有较少的特质和缺陷。 gevent 据我所知,它由 1 个人维护。这让我有些怀疑,但所有伟大的项目都是这样开始的......然后是PyPy - 我什至还没有读完那个 - 刚刚在这个线程中看到它:Drawbacks of Stackless

如此混乱 - 我想知道到底该怎么做 - 听起来 Eventlet 可能是最好的选择,但它真的足够稳定吗?有没有人有这方面的经验?我们是否应该使用 Stackless,因为它已经存在并且是经过验证的技术 - 就像 Twisted 一样 - 它们确实可以很好地协同工作。但我仍然讨厌必须有一个单独的 Python 版本才能做到这一点。怎么办……

这个有点令人讨厌的博客文章对我来说是一针见血:Asynchronous IO for Grownups 我不明白 Twisted 对我来说就像 Java 评论 Java 通常是你处于线程思维方式的地方,但无论如何。尽管如此,如果那个猴子补丁真的像那样工作,那么哇。哇!

【问题讨论】:

  • 您能否进一步评论一下您所说的 MySQL 不适合 OLTP 的含义?
  • 我把它删掉了,因为它与文章的其余部分无关。但它的糟糕之处在于,对视图的支持很差,触发器和存储过程很慢,查询优化器相当原始,难以破译/查询计划的信息不足(也没有可用于更新/删除/插入的计划)。要求所有外键列上的索引通常会导致很多无用的索引,以至于您最终不得不根本不实现外键以避免严重的性能下降。我可以继续……
  • Twisted 是 最知名的 Python 库之一。切换到更晦涩的项目将如何帮助任何人更快地“跟上进度”?
  • 为什么回调是 Twisted 的问题? @inlineCallbacks 不是解决了回调对代码进行卷积的问题吗?
  • +1 到@inlineCallbacks。这就是人类问题的答案。但请确保您的孩子首先了解生成器,否则他们永远不会明白。

标签: python gevent pypy eventlet python-stackless


【解决方案1】:

您可能想签出:

Eventlet 和 gevent 无法与 Stackless 相比,因为 Stackless 附带了一个不支持 tasklet 的标准库。有socket for Stackless 的实现,但没有像gevent.monkey 这样全面的实现。 CCP 不使用基本的 Stackless,它有一种称为 Stackless I/O 的东西,AFAIK 是仅限 Windows 的,并且从未开源(?)。

eventlet 和 gevent 都可以在 Stackless 上而不是在 greenlet 上运行。在某些时候,我们甚至尝试以GSoC project 的身份进行此操作,但没有找到学生。

【讨论】:

  • 非常感谢 Denis - 我已经阅读了 gevent 与 eventlet 的比较,但是从 twisted 或 eventlet 转移到 gevent 的用户的报告很有启发性。
  • @Khorkrak 你问这个问题已经一年半了。我想知道你是否可以分享你从那以后的经历。你最后做了什么?你觉得效果如何?
  • 比较有偏差。 Eventlet 从那时起有了很多改进,现在有了更大的支持。
【解决方案2】:

回答您的部分问题 - 如果您查看 http://speed.pypy.org,您会发现在 PyPy 之上使用 twisted 可能 可以加快速度。这当然取决于您的工作量,但可能值得一试。

干杯,
菲哈尔

【讨论】:

  • 使用 PyPy 可以大大加快速度,因此值得考虑。还有Tornado,它更简单,比扭曲更快,在高负载下工作更稳定。
【解决方案3】:

我在 eventlet 和 repoze.bfg 之上构建了一个小的实时网络应用程序(我很久以前就放弃了 django)。我发现 eventlet 和猴子补丁就像 Ted 说的一样简单。

【讨论】:

    【解决方案4】:

    Gevent 不是纯 Python,它严格依赖于 CPython。 从您提到的 Web 框架中,Eventlet (OpenStack) 和 Tornado (FriendsFeed, Quora) 部署最多。

    【讨论】:

      猜你喜欢
      • 2020-07-14
      • 2017-08-14
      • 2021-03-04
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 2021-06-07
      相关资源
      最近更新 更多