FLASK + GUNICORN + TCP Socket
У меня возникла следующая проблема с Flask запущенным через Gunicorn: У меня есть три скрипта. Первый скрипт - фласк сервер, второй - TCP сервер, третий скрипт запускает первые два скрипта. Если запускаю скрипт фласк сервера через app.run() то все ок. фласк сервер подключается к тсп серверу и все работает. Но если запускаю через gunicorn, то запускается несколько воркеров, и только одному из них удается подключиться к TCP серверу. Есть ли возможность какая-то сделать чтобы подключение по ТСР было одно на все воркеры? То есть сделать так, чтобы сначала выполнялся какой-то код для получения данных, происходило подключение по TCP к TCP серверу, а потом все воркеры подтягивали из него данные и могли обращаться к TCP подключению?
Flask сервер
import json
import os
import socket
import time
import requests
from flask import Flask, request, jsonify, render_template
from flask_httpauth import HTTPBasicAuth
app = Flask(name)
auth = HTTPBasicAuth()
@app.route("/olock_open", methods=['POST'])
@auth.login_required()
def open_lock():
response = {
"success": True,
"error": None
}
data = request.get_json()
if system_data_conf["online_locks_confirm_1c"] == 0:
if len(data["cells"]) > int(system_data_conf["online_locks_quantity"]) or len(data["cells"]) <= 0:
response["success"] = False
response["error"] = "Неверное количество замков"
else:
send_data = [data, 'olock_open']
# print(send_data)
send_command_bu(send_data)
return jsonify(response)
system_data_conf = load_config_data()
run_online_locks = True
if system_data_conf["online_locks_enable"] == 1:
locks_table = load_table_locks()
try:
send_message_to_journalctl(
f'Connecting to ONLINE LOCKS server at address {system_data_conf["host_address_ip"]}:{system_data_conf["online_locks_port"]}')
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((system_data_conf["host_address_ip"], system_data_conf["online_locks_port"]))
except Exception as error:
print(error)
send_message_to_journalctl(error)
time.sleep(0.1)
# if name == 'main':
# app.run(threaded=True, debug=False, host=system_data_conf['host_address_ip'],
# port=system_data_conf['host_address_port'])
Вот так я запускаю guniccorn через os в третьем скрипте:
os.system('gunicorn --config gunicorn_config.py _internal/flaskserver:app')
А это конфиги gunicorn:
import os
workers = int(os.environ.get('GUNICORN_PROCESSES', '2'))
threads = int(os.environ.get('GUNICORN_THREADS', '4'))
# timeout = int(os.environ.get('GUNICORN_TIMEOUT', '120'))
bind = os.environ.get('GUNICORN_BIND', '0.0.0.0:8181')
forwarded_allow_ips = '*'
secure_scheme_headers = { 'X-Forwarded-Proto': 'https' }
Ответы (1 шт):
Решение следующее: Я поменял тип подключения между серверами. вместо AF_INIT использовал AF_UNIX для Unix систем и еще заменил SOCK_STREAM на SOCK_DGRAM. Это односторонний способ отправки запросов на сервер от клиента без ответа через специальный файл и все заработало! В общем у кого будет подобный вопрос, пользуйтесь)
SOCKET_FILE = './echo.socket'
if os.path.exists(SOCKET_FILE):
os.remove(SOCKET_FILE)
server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
server.bind(SOCKET_FILE)