pyftpdlib медленный .читать на файл блокирует весь основной цикл - PullRequest
1 голос
/ 22 декабря 2011

Helllo,

Я использую пользовательский AbstractFS на pyftpdlib, который сопоставляет файлы на HTTP-сервере с FTP.Эти файлы возвращаются моей реализацией open (из 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, волшебным образом не заставляет все работать?

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

pyftpdlib использует модуль Python asyncore, который опрашивает и взаимодействует с dispatcher s.Каждый раз, когда вы связываете FTP-запрос с запросом к HTTP-серверу, вы блокируете цикл asyncore, который использует pydftpdlib.Вы должны реализовать свои HTTP-запросы как диспетчеры, которые соответствуют асинхронной модели, или генерировать потоки для асинхронной обработки запроса и отправки результата обратно обработчику запросов FTP, когда данные поступят.Это несколько сложно, поскольку отсутствует механизм прерывания цикла асинхронного опроса из внешних потоков.

Что касается Eventlet, я не знаю, что он будет хорошо работать с Asyncore, который уже использует неблокирующий механизм ввода-вывода.

0 голосов
/ 23 декабря 2011

Хорошо, я опубликовал сообщение об ошибке на pyftpdlib:

Я бы даже не знал, что именно порекомендовать, так как это проблема, которую трудно решить, и нетпростой или стандартный способ справиться с этим.

Но я получил сумасшедшее решение этой проблемы без использования pyftpdlib.

  1. переписать все с помощью wsgidav (который использует cherrypywsgiserver, поэтому он имеет многопоточность
  2. монтирует эту файловую систему WebDAV как собственную файловую систему (net use в Windows, mount.davfs в Linux)
  3. обслуживает эту смонтированную файловую систему с любым сервером ftp, который может обрабатывать блокировкифайловые системы
...