首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyftpdlib文件块上的慢.read阻塞整个主循环

pyftpdlib文件块上的慢.read阻塞整个主循环
EN

Stack Overflow用户
提问于 2011-12-22 11:23:14
回答 2查看 345关注 0票数 1

你好,

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

代码语言:javascript
复制
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修补所有东西并不能神奇地让所有东西都正常工作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-24 01:49:52

好的,我在pyftpdlib上发布了一个bug report

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

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

使用wsgidav重写所有内容(它使用cherrypy wsgiserver,因此它将threaded)

  • mount
  1. 作为本机文件系统(在windows上是net use,在linux上是mount.davfs )
  2. 将这个挂载的文件系统与任何可以处理阻塞文件系统的ftp服务器一起提供
票数 0
EN

Stack Overflow用户

发布于 2011-12-22 11:34:41

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8599104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档