Я запускаю приложение 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