1

你好,

我正在使用自定义将 HTTP 服务器AbstractFSpyftpdlib的文件映射到 FTP。这些文件由我的open(of AbstractFS) 实现返回,它返回httplib.HTTPResponse由以下类包装的:

class HTTPConnWrapper:
    def __init__(self, obj, filename):
        # make it more file obj like
        self.obj = obj
        self.closed = True
        self.name = filename.split(os.sep)[-1]

    def seek(self, arg):
        pass

    def read(self, bytes):
        #print 'read', bytes
        read = self.obj.read(100) #we DONT read var byes, but 100 bytes
        #print 'ok'
        return read

问题是,如果客户端正在下载文件,整个服务器就会变得迟缓。我能做些什么?有任何想法吗?

PS:为什么只是用猴子修补所有东西并evenetlet不能神奇地让一切正常工作?

4

2 回答 2

2

pyftpdlib 使用 Python 的asyncore模块来轮询并与dispatchers 交互。每次将 FTP 请求映射到对 HTTP 服务器的请求时,都会阻塞asyncorepydftpdlib 正在使用的循环。您应该将 HTTP 请求实现为适合 asyncore 模型的调度程序,或者生成线程来异步处理请求,并在数据到达时将结果发送回 FTP 请求处理程序。这有点困难,因为没有提供从外部线程中断 asyncore 轮询循环的机制。

至于 eventlet,我不知道它是否会与 asyncore 很好地配合,它已经使用了非阻塞 IO 机制。

于 2011-12-22T03:34:41.247 回答
0

好的,我在 pyftpdlib 上发布了一个错误报告:

我什至不知道该推荐什么,因为这是一个难以解决的问题,并且没有简单或标准的方法来处理它。

但是我得到了一个疯狂的解决方案来解决这个问题而不使用 pyftpdlib。

  1. 使用 wsgidav 重写所有内容(它使用cherrypy wsgiserver,因此它是线程化的)
  2. 将该 WebDAV 文件系统挂载为本机文件系统(net use在 Windows 上,mount.davfs在 linux 上)
  3. 使用任何可以处理阻塞文件系统的 ftp 服务器为这个挂载的文件系统提供服务
于 2011-12-23T17:49:51.620 回答