Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Twisted的复合定制服务服务器_Python_Twisted - Fatal编程技术网

Python 使用Twisted的复合定制服务服务器

Python 使用Twisted的复合定制服务服务器,python,twisted,Python,Twisted,我有一个有趣的项目正在我们的工作场所进行。摆在我们面前的任务是: 使用Python构建自定义服务器 它有一个web服务器部件,为REST服务 它有一个FTP服务器部件,为文件提供服务 它有一个SMTP部分,只接收邮件 最后但并非最不重要的一点是,it有一个后台工作程序,它根据从上述服务接收的请求管理低级文件IO 显然,go-to-place是Twisted library/framework,它是一个优秀的网络工具。然而,在进一步研究这些文件时,出现了一些我不确定的事情 有了Java背景,我

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

  • 使用Python构建自定义服务器
  • 它有一个web服务器部件,为REST服务
  • 它有一个FTP服务器部件,为文件提供服务
  • 它有一个SMTP部分,只接收邮件
  • 最后但并非最不重要的一点是,it有一个后台工作程序,它根据从上述服务接收的请求管理低级文件IO
显然,go-to-place是Twisted library/framework,它是一个优秀的网络工具。然而,在进一步研究这些文件时,出现了一些我不确定的事情

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

所以最突出的问题是:鉴于Twisted使用反应堆作为其主要设计模式,它是否能够:

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

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

    • 提供所有需要的服务

    • 以非阻塞方式进行(根据文档,应该这样做,但如果有人能详细说明,我将不胜感激)
    Twisted采用了通用反应堆模型。I/O通过您选择的轮询、选择或任何方式来确定数据是否可用。它只处理可用的数据,并将数据传递到应用程序的其他阶段。这就是非阻塞的方式

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

    • 能够同时为数百名客户提供服务
    对。不,也许吧。那些客户在干什么?浏览器每秒刷新一次是否会发出100个请求?每个人都在做星系碰撞的数值模拟吗?是否每个人都向服务器发送字符串“hi!”,而不需要响应

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

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

    当然。例如,BitTorrent的原始版本是用Twisted编写的。

    是的,你可以编写一个Twisted应用程序来提供所有这些服务,但我不确定你为什么想要/需要一个单片应用程序中的所有这些东西。这是有原因的,但我不想详细说明,因为这不是问题所在。但是大小并不重要,重要的是客户机与服务器保持连接的时间。我不知道你在暗示什么。客户保持联系的时间有多重要?这与文件大小无关吗?我的意思是,当客户机主动连接到服务器时,它占用了一个其他人无法占用的插槽,因此,服务器必须以某种方式处理这个问题,而lib应该可以很好地处理这个问题。这句话措词不当,很抱歉。当然,这与尺寸有关。阿得鲁,谢谢你的见解,让我详细说明一下。至于非阻塞解释,我明白你的意思,有点困惑反应堆和生产者/消费者是如何工作的,等等,现在我明白了。客户在做什么,我解释得太宽泛了。大多数情况下,他们会通过PUT/GET上传/下载文件,这意味着打开连接并传输数据。我关心的是,在反应堆上挂接几个不同的服务是否合适。从你回答的语气来看,我应该没事的。