龙卷风/Twisted - Celery - Gevent比较

23

我有点难以理解这三种框架之间的区别:

这三个框架可以同时运行代码,但使用不同的方式,线程/进程数或代码风格。这是我现在对区别的理解:

  • Tornado/Twisted 使用一个I/O循环控制异步代码。这使得代码可以在单个线程上运行(如果您有非阻塞代码,则多个线程是无用的)
  • Celery 使用基于任务的系统异步运行代码,代码本身仍然是同步的。存在一个主进程,能够将不同的任务分配给不同进程中的其他工作人员。
  • Gevent 使用基于线程的系统并生成一个线程来处理不同的传入连接。

我现在的问题是:

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

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

Celery/Gevent 能够做到这一点吗?它们是否需要生成新的进程/线程才能接受新的套接字?

我正在尝试弄清楚哪种技术最适合构建实时 Web 应用程序。


很好的想法,可以在这个问题中添加Asyncio,并得到一些比较它与其他方法的答案。 - chuseuiti
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,因此如果需要,可以同时处理多个任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接