2011-12-22 7 views
1

Helllo、pyftpdlib遅い.readファイルブロックの全体のメインループ

私は、FTPへのHTTPサーバー上のファイルをマップpyftpdlib上のカスタムAbstractFSを使用しています。

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 

問題は、クライアントがファイルをダウンロードした場合、サーバー全体が低迷becommesことです: このファイルには、以下のクラスによってラップhttplib.HTTPResponseを返しopenAbstractFSの)私の実装によって返されます。 どうすればいいですか? アイデア

PS: なぜ、猿はすべてevenetletでパッチを当てるだけで魔法のように動作しませんか?

答えて

0

[OK]を、私はpyftpdlibにbug report投稿:

私もそれを解決するのは難しいですし、それに対処する簡単なまたは標準的な方法はありません問題だとまったくお勧めするのか分からないだろう。

しかし、私はpyftpdlibを使用せずにこの問題を解決するために狂った解決策を得ました。

  1. 書き換えすべて
  2. が、これはとファイルシステムをマウントサーブ( は、Windows、Linux上のmount.davfsnet use)ネイティブファイルシステムとしてそのWebDAVのファイルシステムをマウント(そのねじ切りので、CherryPyは てWSGIServerを使用しています)wsgidavを使用して ブロックするファイルシステムを処理できるftpサーバー
2

pyftpdlibは、dispatcherをポーリングして対話するPythonのasyncoreモジュールを使用します。 FTPリクエストをHTTPサーバーにマップするたびに、pydftpdlibが使用しているasyncoreループがブロックされます。 asyncoreモデルに適合するディスパッチャとしてHTTPリクエストを実装するか、リクエストが非同期的に処理されるようにスレッドを生成し、データが到着したときに結果をFTPリクエストハンドラに返す必要があります。これは、外部スレッドからasyncoreのポーリングループを中断するメカニズムがないため、やや難しいことです。

イベントレットに関しては、すでにノンブロッキングIOメカニズムを利用しているasyncoreでうまくいくかどうかわかりません。

+0

問題は、.readがファイルに対して呼び出されたときに制御できないことです。利用可能なデータがない場合は、 – nomoral

+0

'eventlet.green.asyncore'が存在するため、eventletがasyncoreをサポートしているようです – nomoral