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

Python 龙卷风/扭曲-芹菜-Gevent比较,python,twisted,celery,tornado,gevent,Python,Twisted,Celery,Tornado,Gevent,我在理解这三个框架之间的差异时遇到了一些困难: / 这三个框架可用于同时运行代码,但使用不同数量的线程/进程或代码样式以不同的方式运行代码。这就是我现在理解差异的方式: Tornado/Twisted使用由I/O循环控制的异步代码。这允许代码在单个线程上运行(多个线程是无用的,因为如果您有非阻塞代码,这是不必要的) 西芹使用基于任务的系统异步运行代码,代码本身仍然是同步的。存在一个主流程,它能够在不同流程上的其他工作人员之间分配不同的任务 Gevent使用基于线程的系统并生成一个线程来

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

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

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

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

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

    我试图找出这些技术中哪一种最适合构建实时web应用程序

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

    芹菜更多地用于后台处理,将昂贵的计算转移到另一个进程/服务器

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

    我不确定芹菜的内存需求,但如果您使用1个web进程和1个后台进程,即使在256MB VPS上也应该可以,不过如果您支持多个连接,则更多更好

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

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


  • 将Asyncio添加到这个问题中,并将其与其他问题进行比较,这将是一件好事。