Несколько CLOSE_WAIT при использовании облачного речевого API Google с сервером торнадо.Ошибка слишком большого количества открытых файлов - PullRequest
0 голосов
/ 31 января 2019

Я получаю несколько потоков одного и того же процесса в CLOSE_WAIT, из-за чего я получаю ошибку «слишком много файлов открыто».

OSError: [Errno 24] Too many open files: 

Это происходит, когда выполняется несколько вызовов API облака Google Google..

Прошли ответы на различные вопросы о stackoverflow, но я не могу найти решение.

sudo lsof | grep -i close | wc -l

15180

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

import os
import tornado.httpserver, tornado.ioloop, tornado.options, tornado.web, tornado.escape
import os.path
import string
import json
from google.cloud import speech
from google.cloud.speech import types, enums

tornado.options.parse_command_line()
tornado.options.define("port", default=8888, help="run on the given port", type=int)
SPEECH_TO_TEXT_CREDENTIALS = 'my_json_file.json'
UPLOAD_FOLDER = '/home/ubuntu/uploads'

class Application(tornado.web.Application):

    def __init__(self):
        os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = SPEECH_TO_TEXT_CREDENTIALS
        self.speech_client = speech.SpeechClient()
        handlers = [
            (r"/test_bug/client/googlestt2", GoogleSTTHandler)
        ]
        tornado.web.Application.__init__(self, handlers)

class GoogleSTTHandler(tornado.web.RequestHandler):
    def post(self):
        if 'audio' not in self.request.files:
            self.finish({'Error': "No audio provided"})
        audio_filename =  'test.wav'
        audio = self.request.files['audio'][0]
        with open(os.path.join(UPLOAD_FOLDER, audio_filename), 'wb') as f:
            f.write(audio['body'])
        with open(os.path.join(UPLOAD_FOLDER, audio_filename), 'rb') as audio_file:
            content = audio_file.read()
        audio = types.RecognitionAudio(content=content)
        config = types.RecognitionConfig(encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, language_code='en-IN')
        response = self.application.speech_client.recognize(config, audio)
        if not response.results:
            Transcript_Upload = "Empty Audio"
        else:
            for result in response.results:
                Transcript_Upload = 'Transcript: {}'.format(result.alternatives[0].transcript)
        self.finish(Transcript_Upload)

def main():
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(tornado.options.options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
   main()

Пожалуйста, предложите, если я делаю что-то не так, и как это исправить.

1 Ответ

0 голосов
/ 01 февраля 2019

Эта известная проблема в google-cloud-python, а также gcloud-python - https://github.com/googleapis/google-cloud-python/issues/5570. Я ее отбросил, и с тех пор я напрямую использую API Google.

Как примечание, выиспользуют синхронный API, но для использования Tornado (фактически любой асинхронной структуры) вы должны использовать асинхронные библиотеки / вызовы и т. д., например gyn-cloud-python's Asynchronous Recognition

...