#python-3.x #flask #python-multithreading #wsgi #flask-socketio
#python-3.x #flask #python-многопоточность #wsgi #flask-socketio
Вопрос:
У меня есть веб-приложение, использующее модуль python flask, который имеет реализацию flask_socketio для связи между сервером и клиентом. Клиент вызовет API в приложении, метод вызовет функцию в потоке и вернет ответ. Функция thread выполнит несколько HTTP-запросов и также получит сообщения сокета.
После нескольких часов / нескольких выполнений я получаю следующую ошибку
(10160) wsgi завершен, is_accepting= True Исключение в потоке Thread-1: Трассировка (последний последний вызов): Файл «C:UserstestAppDataLocalProgramsPythonPython36libthreading.py «, строка 916, в файле _bootstrap_inner self.run() «C:UserstestAppDataLocalProgramsPythonPython36libthreading.py «, строка 864, в run self._target(*self._args, **self.kwargs) файл «C:UserstestAppDataLocalProgramsPythonPython36libsite-packagesflask_socketio_init.py «, строка 578, в файле run_server log_output=log_output, **kwargs) «C:UserstestAppDataLocalProgramsPythonPython36libsite-packageseventletwsgi.py «, строка 990, в сервере client_socket, файл client_addr = sock.accept() «C:UserstestAppDataLocalProgramsPythonPython36libsite-packageseventletgreeniobase.py «, строка 230, в accept self._trampoline(fd, read=True, timeout=self.gettimeout(), timeout_exc=_timeout_exc) Файл «C:UserstestAppDataLocalProgramsPythonPython36libsite-packageseventletgreeniobase.py «, строка 210, в файле _trampoline mark_as_closed=self.mark_as_closed) «C:UserstestAppDataLocalProgramsPythonPython36libsite-packageseventlethubs_init .py», строка 159, в файле trampoline return hub.switch() «C:UserstestAppDataLocalProgramsPythonPython36libsite-packageseventlethubshub.py «, строка 298, в файле switch return self.greenlet.switch() «C:UserstestAppDataLocalProgramsPythonPython36libsite-packageseventlethubshub.py «, строка 350, в файле run self.wait(sleep_time) «C:UserstestAppDataLocalProgramsPythonPython36libsite-packageseventlethubsselects.py «, строка 42, в ожидании r,w, er = select.select(reader_fds, writer_fds, all_fds, секунды) Ошибка значения: слишком много файловых дескрипторов в select()
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'
CORS(app)
socketIo = SocketIO(app, cors_allowed_origins="*")
app.debug = True
app.host = '0.0.0.0'
@socketIo.on("data")
def handleMessage(msg):
socketIo.emit('data', msg)
return None
@socketIo.on("connect")
def handleMessage():
print('connect')
return None
def sendMessage(msg):
print('inside send message')
socketIo.emit(('message', 'sending message from rest'))
return None
@socketIo.on('disconnect')
def test_disconnect():
print('Client disconnected')
return None
app.register_blueprint(execution_blueprint)
if __name__ == '__main__':
socketIo.run(app, host='0.0.0.0', port=5001)
Нитки:
class Compute(Thread):
def __init__(self, data):
Thread.__init__(self)
self.data = data
def run(self)
execution(self.data)
def start_thread(data):
thread_a = Compute(data)
thread_a.start()
return "Process Started in Background"