22

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

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

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

我现在遇到的问题是:

  1. 我对这些框架的理解正确吗?
  2. 线程和进程之间的主要区别在于不同的线程使用相同的内存而进程不使用。一个进程通常在一个服务器核心上运行吗?(从而使 Celery 难以在小型服务器上实现)
  3. 如果我们谈论的是web 应用程序和套接字

Tornado/Twisted能够接受(几乎)任意数量的套接字,因为它们使用异步代码并在 I/O 循环中对请求进行排队。

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

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

4

1 回答 1

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

    Celery 更多地用于后台处理,以将昂贵的计算卸载到另一个进程/服务器。

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

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

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

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

于 2013-06-16T12:56:59.863 回答