Python Django';在ApacheWSGi中,似乎每个线程调用一次AppConfig.ready()
我在apps.py中有以下代码:Python Django';在ApacheWSGi中,似乎每个线程调用一次AppConfig.ready(),python,django,multithreading,apache,mod-wsgi,Python,Django,Multithreading,Apache,Mod Wsgi,我在apps.py中有以下代码: class Pqawv1Config(AppConfig): # ... def ready(self): env_run_main=os.environ.get('RUN_MAIN') print('IS_PRODUCTION=%s, RUN_MAIN=%s' % (settings.IS_PRODUCTION, env_run_main)) if (not settings.IS_PRODUCT
class Pqawv1Config(AppConfig):
# ...
def ready(self):
env_run_main=os.environ.get('RUN_MAIN')
print('IS_PRODUCTION=%s, RUN_MAIN=%s' % (settings.IS_PRODUCTION, env_run_main))
if (not settings.IS_PRODUCTION) and (env_run_main != 'true'):
print('Exiting because detected running in reloader.')
return
print('Starting up for PID=%s, argv=%s...' % (os.getpid(), sys.argv))
# Initialization of a singleton object from a C++ DLL
# Raise an exception if this library was already initialized in this process
晚上,我重新启动了服务器,它按预期在日志中打印了以下内容:
[Sun Sep 15 22:50:34.928549 2019] [wsgi:error] [pid 11792:tid 1176] Starting up for PID=11792, argv=['mod_wsgi']...\r
然而,早上我注意到发生了一些奇怪的事情。看起来Apache为web应用程序启动了一个新线程:
[Mon Sep 16 04:10:41.224464 2019] [wsgi:error] [pid 11792:tid 1160] Starting up for PID=11792, argv=['mod_wsgi']...\r
后来:
[Mon Sep 16 07:16:21.028429 2019] [mpm_winnt:error] [pid 11792:tid 2272] AH00326: Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting
我认为这不是两次调用
AppConfig.ready()
方法的问题,因为在这两次调用之间有对网站的请求,并且处理得很好。看起来Django的AppConfig.ready()
方法在Apache进程的每个工作线程中调用一次。是这样吗?在这种情况下,如何在Apache和mod wsgi支持的Django中每个进程运行一次代码,而不是每个线程运行一次代码?这可能不是答案,具体取决于您的Apache配置。但是,大多数apache mod_wsgi配置建议您在重新启动wsgi进程之前实现某种max_请求。您的代码可能是基于正常请求执行此操作,或者您的代码遇到django异常
在这两种情况下,您应该能够通过apache配置或选项单独判断这一点
一些值得注意的选择
重新启动间隔=sss
以秒为单位定义一段时间的时间限制
守护进程应在重新启动之前运行
这可能用于定期强制重新启动WSGI应用程序
处理与Python对象引用相关的问题
计数周期,或不正确使用内存缓存,导致
持续的记忆增长
如果此选项未定义或定义为0,则守护进程
进程将是持久的,并将继续为请求提供服务,直到
Apache本身被重新启动或关闭
避免将该值设置得太低。这是因为不断的重新启动
重新加载WSGI应用程序可能会导致不必要的加载
您的系统和影响性能
您可以将优雅超时选项与此选项结合使用
选项,以减少激活请求的可能性
由于使用此选项而重新启动时中断
最大请求数=nnn
定义对请求数量的限制
守护进程应在关闭和重新启动之前进行处理
这可能用于定期强制重新启动WSGI应用程序
处理与Python对象引用相关的问题
计数周期,或不正确使用内存缓存,导致
持续的记忆增长
如果此选项未定义或定义为0,则守护进程
进程将是持久的,并将继续为请求提供服务,直到
Apache本身被重新启动或关闭
避免在处理请求的站点上将此设置为较低的请求数
交通很拥挤。这是因为不断的重新启动和
重新加载WSGI应用程序可能会导致不必要的负载
影响系统和性能。仅当您没有此选项时才使用此选项
由于内存使用问题而导致的其他选择。尽快停止使用它
内存问题已经解决
您可以将优雅超时选项与此选项结合使用
选项,以减少激活请求的可能性
由于使用此选项而重新启动时中断
非活动超时=sss
定义允许的最大秒数
在守护进程关闭并在
守护进程已进入空闲状态。为此目的
选项,空闲表示当前没有活动请求,也没有
正在收到新的请求
此选项允许在中运行不常用的应用程序
要重新启动的守护进程,从而允许使用内存
可以回收,进程大小会回落到初始启动时
加载任何应用程序或处理任何请求之前的大小
请注意,在重新启动WSGI应用程序进程之后,WSGI
应用程序将需要重新加载。这可能意味着
进程重新启动后收到的请求可以是
更慢的。如果WSGI应用程序在CPU上的启动成本非常高
随着时间的推移,使用该选项可能不是一个好主意
另请参见请求超时选项,用于在以下情况下强制重新启动进程:
请求在指定的时间段内被阻止
请注意,与请求超时选项的功能类似,
在请求被阻止时强制重新启动是
由非活动超时选项实现。请求超时为
在mod_wsgi的4.1.0版本中,它被分解成一个单独的功能
请求超时=sss
定义一个事件发生的最大秒数
允许在重新启动守护进程之前运行请求。这
可用于从请求阻塞的场景中恢复
无限期,如果所有的请求线程都在这个
这样,将导致整个WSGI应用程序进程被阻塞
此选项的行为方式取决于
守护进程只使用一个线程,或多个线程用于
处理由threads选项设置的请求
如果只有一个线程,那么进程只能处理
一次一个请求,一旦超时时间过去,将重新启动
这一进程将启动
如果有多个线程,则请求超时将应用于
所有线程中任何请求的平均运行时间。这
表示请求的运行时间可以超过请求超时时间。这是
这样做是为了减少中断其他正在运行的请求的可能性,
以及使用户