使用Twisted的复合自定义服务服务器

时间:2011-12-09 10:14:51

标签: python twisted

我的工作场所正在进行一个有趣的项目。摆在我们面前的任务是这样的:

  • 使用Python构建自定义服务器
  • 它有一个Web服务器部分,服务于REST
  • 它有一个FTP服务器部分,提供文件
  • 它有一个SMTP部分,仅接收邮件
  • 最后但并非最不重要的是,它有一个后台工作者,它根据从上述服务收到的请求来管理低级文件IO

显然,转到的地方是Twisted库/框架,这是一个非常好的网络工具。然而,进一步研究文档,我发现了一些我不确定的事情。

拥有Java背景,我会通过为每个服务生成一个单独的线程并从那里开始来解决任务(至少在开始时)。然而,在Python中,我不能为了任何合理的目的而这样做,因为Python有GIL。我不确定,Twisted如何处理这个问题。我希望,Twisted有大量(如果不是多数)代码用C编写,其中GIL不是问题,但我找不到文档解释到我满意。

所以最常见的问题是:鉴于Twisted使用Reactor作为其主要设计模式,它是否能够:

  1. 提供所需的所有服务
  2. 以非阻塞方式进行(根据文档,它应该如此,但如果有人可以详细说明,我将不胜感激)
  3. 能够同时为数百名客户提供服务
  4. 以合理的方式提供大型文件下载,这意味着它可以为多个客户端提供服务,使用多种服务,下载和上传大文件。
  5. 大文件的大小为几百MB或几GB。大小并不重要,它是客户端必须保持与重要服务器连接的时间。

    编辑:我实际上倾向于采用python多处理方式,但不确定,这对Twisted等是否正确。

1 个答案:

答案 0 :(得分:3)

  • 提供所需的所有服务

  • 以非阻塞方式进行(根据文档,它应该如此,但如果有人可以详细说明,我将不胜感激)

Twisted使用通用反应堆模型。 I / O通过您选择的民意调查,选择,以确定数据是否可用。它仅处理可用内容,并将数据传递到应用程序的其他阶段。这就是非阻塞的方式。

我认为它不提供非阻塞磁盘I / O,但我不确定。这个功能并不是大多数人在说非阻塞时所需要的。

  • 能够同时为数百名客户提供服务

是。不,也许吧。那些客户在做什么?在浏览器发出100个请求时,每一个都会刷新一次吗?每个人都在进行星系碰撞的数值模拟吗?每个发送字符串“嗨!”到服务器,没有期待回应?

Twisted每秒可轻松处理1000多个请求。

  • 以合理的方式提供大型文件下载,这意味着它可以为多个客户端提供服务,使用多种服务,下载和上传大文件。

不确定。例如,BitTorrent的原始版本是用Twisted编写的。