Возврат BLOB-объектов базы данных в TurboGears 2.x / FCGI / Lighttpd очень медленный - PullRequest
1 голос
/ 26 мая 2010

Я запускаю приложение TG2 на lighttpd через flup / fastcgi. Мы читаем изображения (~ 30 КБ каждый) из BlobFields в базе данных MySQL и возвращаем эти изображения с пользовательским типом MIME с помощью метода контроллера. Кэширование этих изображений на жестком диске не имеет смысла, поскольку они меняются при каждом запросе, единственная причина, по которой мы кэшируем их в БД, заключается в том, что создание этих изображений довольно дорого, а данные, используемые для создания изображений, также присутствуют в виде простого текста Веб-сайт.

Теперь к самой проблеме:

При возврате такого изображения все становится очень медленным. Код работает полностью на самом paster без видимой задержки, но как только он запускается через fcgi / lighttpd, описанное явление происходит.

Я профилировал метод моего контроллера, который возвращает мой BLOB-объект, и весь метод выполняется за несколько миллисекунд, но когда выполняется «возврат», все приложение зависает примерно на 10 секунд.

Мы не смогли воспроизвести ту же ошибку с PHP на FCGI. Похоже, это происходит только с турбонагнетателями или пилонами.

Здесь для вашего рассмотрения заинтересованный кусок исходного кода:

@expose(content_type=CUSTOM_CONTENT_TYPE)
def return_img(self, img_id):
    """ Return a DB persisted image when requested """

    img = model.Images.by_id(img_id) #get image from DB
    response.headers['content-type'] = 'image/png'
    return img.data # this causes the app to hang for 10 seconds

1 Ответ

0 голосов
/ 08 июля 2010

Понятия не имею, правда, но, поскольку здесь нет ответов, я попробую сделать дикое предположение.

Возможно

response.headers['content-length'] = len(img.data)

поможет?

...