Eventlet、gevent、Stackless与Twisted、Pylons、Django及SQL Alchemy

36 投票
4 回答
21415 浏览
提问于 2025-04-16 00:00

我们在开发需要大量异步输入输出的应用时,广泛使用了Twisted框架。不过,有些情况下,处理的任务主要是依赖CPU的,这时我们会启动一组进程来完成这些工作,并且有一个系统来管理这些进程在多个服务器之间的分配,这一切都是在Twisted中完成的,效果很好。不过,问题是让新团队成员快速上手有点困难。在Twisted中编写异步代码的学习曲线几乎是垂直的,感觉人类并不自然地以这种方式思考。

我们在考虑一种混合的方法。也许可以把xmlrpc服务器部分和进程管理留在Twisted中,而其他部分用一些看起来是同步的代码来实现,虽然实际上不是这样。不过,我更喜欢明确的东西而不是隐含的,所以我还需要再想想。接下来谈谈greenlets,这东西效果怎么样呢?Stackless是一个选择,正如你从我头像中可以看出,我对它在CCP的旗舰游戏《EVE Online》中的成功使用非常了解。那Eventlet或gevent呢?目前只有Eventlet可以和Twisted一起使用。不过,gevent声称它更快,因为它不是纯Python实现,而是依赖libevent。它还声称有更少的特殊情况和缺陷。gevent 目前看起来是由一个人维护的,这让我有点担心,但所有伟大的项目都是这样开始的,所以……然后还有PyPy,我甚至还没读完关于它的资料,只是在这个讨论中看到的:Stackless的缺点

真让人困惑,我在想到底该怎么做——听起来Eventlet可能是最好的选择,但它真的足够稳定吗?有没有人有过使用它的经验?我们是不是应该选择Stackless,因为它已经存在很久并且是经过验证的技术,就像Twisted一样,它们之间的配合也很好。不过,我还是不喜欢为了这个而使用一个单独的Python版本。该怎么办呢……

不过,这篇有点让人不爽的博客文章正好说到了我的心里话:为成年人提供的异步IO。我不太理解把Twisted比作Java的说法,因为我觉得Java通常是在多线程的思维模式中,但无所谓了。不过,如果那个猴子补丁真的像那样有效,那真是太棒了!

4 个回答

0

我做了一个小的实时网页应用,使用了eventlet和repoze.bfg(我很久以前就放弃了django)。我发现eventlet和猴子补丁(monkey patching)真的和Ted说的一样简单。

4

回答你问题的一部分——如果你去看看 http://speed.pypy.org,你会发现把 twisted 放在 PyPy 上用可能会让你的程序跑得更快。当然,这还得看你具体的工作负载,但值得一试。

祝好,
fijal

28

你可能想看看:

Eventlet和gevent其实没法和Stackless直接比较,因为Stackless自带的标准库并不知道有任务(tasklets)的存在。虽然有一些为Stackless实现的socket模块,但没有像gevent.monkey那样全面的东西。CCP并没有使用最基本的Stackless,它有一种叫做Stackless I/O的东西,听说只在Windows上能用,而且从来没有开源过(?)。

其实eventlet和gevent也可以在Stackless上运行,而不是在greenlet上。我们曾经尝试过把这个作为一个GSoC项目来做,但没有找到合适的学生。

撰写回答