龙卷风/扭曲 - 芹菜 - Gevent比较

时间:2013-06-15 18:22:37

标签: python twisted celery tornado gevent

我在理解这三个框架之间的差异时遇到了一些麻烦:

这三个框架可用于同时运行代码,但使用不同数量的线程/进程或代码样式以不同方式执行此操作。这就是我现在理解差异的方式:

  • Tornado / Twisted 使用由I / O循环控制的异步代码。这允许代码在单个线程上运行(多个线程是无用的,因为如果你有非阻塞代码,这是不必要的)
  • Celery 使用基于任务的系统异步运行代码,代码本身仍然是同步的。存在一个主要流程,能够在不同流程上的其他工作人员之间分配不同的任务。
  • Gevent 使用基于线程的系统并生成一个线程来处理不同的崩溃连接。

我现在遇到的问题是:

  1. 我对这些框架的理解是否正确?
  2. 线程和进程之间的主要区别在于不同的线程使用相同的内存,而进程则没有。一个进程通常在一个服务器核心上运行吗? (从而使Celery很难在小型服务器上实现)
  3. 如果我们谈论网络应用程序和套接字
  4. Tornado / Twisted 能够接受(几乎)任意数量的套接字,因为它们使用异步代码并在I / O循环中对请求进行排队。

    Celery / Gevent 能够做到这一点吗?他们是否必须生成一个新的进程/线程才能接受新的套接字?

    我正在试图找出哪种技术最适合构建实时Web应用程序。

1 个答案:

答案 0 :(得分:19)

  1. Gevent隐式使用greenlets代替IO循环上的线程,因此在Twtisted / Tornado的情况下没有反应器/ IO循环来手动启动。它还能够修补现有的库以支持它的操作,Tornado和Twisted需要特定的库来处理它们的事件循环,尽管你会发现许多库已经存在。

    Celery为后台处理做了更多工作,以便将昂贵的计算转移到另一个进程/服务器。

  2. 进程可以共享内存,但不能与线程共享内存。 CPython中的线程受GIL的影响,如果你正在做任何CPU密集型操作,通常不值得使用线程解决方案。

    我不确定Celery的内存要求,但如果你使用1个网络进程和1个后台进程,即使在256MB VPS上也应该没问题,但如果你支持很多连接则会更好。

    < / LI>
  3. 可以使用Tornado / Twisted / Gevent处理的套接字数量可能受每个套接字完成IO的数量和频率的限制。低频/低带宽套接字更容易支持大量并发连接,因为它们通常是空闲的。

    Celery仍然需要一些应用程序来监听套接字并使用Celery守护程序进行调用。它也支持Gevent,因此如果需要,您可以同时处理多个任务。