Python Django';在ApacheWSGi中,似乎每个线程调用一次AppConfig.ready()

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

我在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_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选项设置的请求

如果只有一个线程,那么进程只能处理 一次一个请求,一旦超时时间过去,将重新启动 这一进程将启动

如果有多个线程,则请求超时将应用于 所有线程中任何请求的平均运行时间。这 表示请求的运行时间可以超过请求超时时间。这是 这样做是为了减少中断其他正在运行的请求的可能性, 以及使用户