python - 使用多个 Gunicorn 工作者时仅启动一次 Django 配置应用程序
问题描述
我在用着 :
- 蟒蛇3.6
- django==2.1.1
- 独角兽==19.9.0
我做了以下事情:
- 创建了一个名为
api
- 创建了一个
apiapp
(我的项目中的一个应用程序)
我在 api_app 中有这个代码apps.py
:
from django.apps import AppConfig
from api import settings
class ApiappConfig(AppConfig):
name = 'apiapp'
verbose_name = "random_name"
def ready(self):
self.job()
@classmethod
def job(cls):
### doing whatever here for example :
print(settings.SHARED_VARIABLE)
以及 api_app 中的以下内容__init__.py
:
import os
default_app_config = 'apiapp.apps.ApiappConfig'
我正在创建一个 API,因此我需要在部署时使用多个工作人员:
gunicorn api.wsgi -w 10
现在,我的问题是job
服务器启动时调用的函数被调用了 10 次,因为我使用了 10 个 gunicorn 工人,我只想调用它一次
我想做的另一件事是让
settings.SHARED_VARIABLE
变量在不同的工人之间共享。此变量将仅由将启动app.py
服务器启动的工作人员更新。
谢谢 !
解决方案
gunicorn 有一个设置来做到这一点:--preload
所以,在我添加这个之后settings.py
:(SHARED_VARIABLE = 'content of SHARED_VARIABLE'
并固定apiapp/__init__.py
使用真实的应用程序名称),我可以在应用程序加载一次的情况下运行 gunicorn:
$ gunicorn api.wsgi -w 10 --preload
content of SHARED_VARIABLE
[2018-12-31 10:12:15 +0000] [394] [INFO] Starting gunicorn 19.6.0
[2018-12-31 10:12:15 +0000] [394] [INFO] Listening at: http://127.0.0.1:8000 (394)
[2018-12-31 10:12:15 +0000] [394] [INFO] Using worker: sync
[2018-12-31 10:12:15 +0000] [399] [INFO] Booting worker with pid: 399
[2018-12-31 10:12:15 +0000] [400] [INFO] Booting worker with pid: 400
[2018-12-31 10:12:15 +0000] [401] [INFO] Booting worker with pid: 401
[2018-12-31 10:12:15 +0000] [403] [INFO] Booting worker with pid: 403
[2018-12-31 10:12:15 +0000] [404] [INFO] Booting worker with pid: 404
[2018-12-31 10:12:15 +0000] [405] [INFO] Booting worker with pid: 405
[2018-12-31 10:12:15 +0000] [406] [INFO] Booting worker with pid: 406
[2018-12-31 10:12:15 +0000] [408] [INFO] Booting worker with pid: 408
[2018-12-31 10:12:15 +0000] [410] [INFO] Booting worker with pid: 410
[2018-12-31 10:12:15 +0000] [411] [INFO] Booting worker with pid: 411
推荐阅读
- python - 如何正确使用 `cv2.putText` 在视频上绘制阿拉伯文字?(Python+OpenCV)
- swiftui - 具有多个 onReceive() 处理程序的 macOS SwiftUI SceneView 似乎相互阻塞
- javascript - 找不到模块'react-bootstrap/lib/breadcrumb'
- oracle - 需要关于如何优化我的函数 PL/SQL 的建议
- swift - 强制 *new* Finder 窗口以编程方式打开
- jmeter - 从命令行在 JMeter 中生成汇总报告
- c++ - 关于#ifndef 之后的#define 宏
- python - 正则表达式对象如何在 Python 循环中工作?
- android - Android build.gradle 排除重复类
- angular - 这是过滤 BehaviorSubject 的正确方法吗