代码之家  ›  专栏  ›  技术社区  ›  Enrico Carlesso

有一个线程与wsgi上的django项目并行的正确方法

  •  2
  • Enrico Carlesso  · 技术社区  · 14 年前

    我正在写一个Django项目,我需要一个执行某些任务的并行线程。

    该项目将与mod wsgi一起部署在Apache2.2中。

    实际上,我的实现包含在一个线程上, 当真的-睡觉 从我的 DJango.WSGI 文件。

    此实现是否正确?

    出现了两个问题:django.wsgi是否只被调用一次?我将只运行该线程的实例吗?第二,我需要“手动”访问至少一个页面来运行线程。有解决办法吗?

    有人对更好的解决方案有什么建议吗?

    事先谢谢。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Graham Dumpleton    14 年前

    对于必须发出请求以触发线程创建的变通方法请求,您有两个选项。第一种方法是使用wsgiimportscript指令在启动时预加载wsgi脚本文件。第二种方法是使用流程组和应用程序组选项对wsgiscriptaalias实现相同的功能。

    首选第二种方式。您还希望确保您使用的是守护程序模式,这样,如果更改了wsgi脚本文件,则会重新加载整个进程。如果您使用嵌入模式并且wsgi脚本文件已更改,那么只需重新加载脚本,您将创建第二个后台线程。

    因此,对于守护程序模式,请使用:

    WSGIDaemonProcess mysite
    WSGIScriptAlias / /some/path/django.wsgi process-group=mysite application-group=%{GLOBAL}
    

    该进程组和应用程序组选项都显式地提供给wsgiscriptaalias,在任何请求到达之前,在进程启动时预加载wsgi脚本文件会产生副作用。

    注意,您必须使用mod wsgi 3.0或更高版本,以便后者能够向wsgiscriptaalias提供选项来实现这一点。


    更新1

    如果您在Windows上,并且没有访问守护程序模式的权限:

    WSGIImportScript /some/path/django.wsgi application-group=%{GLOBAL}
    WSGIScriptAlias / /some/path/django.wsgi application-group=%{GLOBAL}
    

    似乎是mod_wsgi中的一个遗漏,即当守护程序模式不可用时,仅为wsgiscriptaalias设置应用程序组仍会导致预加载。

        2
  •  2
  •   Daniel Roseman    14 年前

    为什么要在线程中运行这个?如果您想要一个单独的长时间运行的进程,那么从命令行或守护进程创建一个。或者,使用类似的东西 celery .

    推荐文章