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 шт):

Автор решения: lolman dez12345

Решение следующее: Я поменял тип подключения между серверами. вместо 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)
→ Ссылка