我通过 Gunicorn 运行 Flask 时遇到以下问题:我有三个脚本。第一个脚本是 Flask 服务器,第二个脚本是 TCP 服务器,第三个脚本运行前两个脚本。如果我通过 app.run() 运行 Flask 服务器脚本,那么一切正常。 Flask 服务器连接到 tsp 服务器,一切正常。但是,如果我通过gunicorn启动它,则会启动多个worker,并且只有其中一个能够连接到TCP服务器。有没有一种方法可以确保所有工作人员都通过 TCP 建立一个连接?也就是说,确保首先执行一些代码来接收数据,与TCP服务器建立TCP连接,然后所有worker从中提取数据并可以访问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'])
这就是我在第三个脚本中通过 os 运行 Guniccorn 的方式:
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' }
解决办法如下:我改变了服务器之间的连接类型。对于 Unix 系统,我使用 AF_UNIX 而不是 AF_INIT,并且还用 SOCK_DGRAM 替换了 SOCK_STREAM。这是一种从客户端向服务器发送请求的单向方法,无需通过特殊文件进行响应,并且它有效!一般来说,任何有类似问题的人都可以使用它)