I'm writing a django project, and I need to have a parallel thread which performs certain tasks.
The project will be deployed in Apache2.2 with mod_wsgi.
Actually my implementation consists on a thread with a while True - Sleep which is called from my django.wsgi file.
Is this implementation correct?
Two problems raises: does django.wsgi get called only once? Will I have just that instance of the thread running? And second, I need to "manually" visit at least a page to have the Thread run. Is there a workaround?
Does anyone has some hints on better solutions?
Thanks in advance.
As to your request for workaround for having to make a request to trigger creation of thread, you have two options. The first is to use the WSGIImportScript directive to preload your WSGI script file at startup. The second being to achieve the same thing using process-group and application-group options to WSGIScriptAlias.
The second way is preferred. You also want to make sure you are using daemon mode such that if WSGI script file is changed that whole process is reloaded. If you use embedded mode and WSGI script file changed, just the script is reloaded and you will create a second background thread.
Thus, for daemon mode use:
WSGIDaemonProcess mysite
WSGIScriptAlias / /some/path/django.wsgi process-group=mysite application-group=%{GLOBAL}
That process-group and application-group options are both explicitly supplied to WSGIScriptAlias has side effect of preloading WSGI script file on process start before any requests have arrived.
Note, you must be using mod_wsgi 3.0 or later for theis latter ability of supplying options to WSGIScriptAlias to achieve this.
UPDATE 1
If you are on Windows and don't have access to daemon mode:
WSGIImportScript /some/path/django.wsgi application-group=%{GLOBAL}
WSGIScriptAlias / /some/path/django.wsgi application-group=%{GLOBAL}
Seems to be an omission in mod_wsgi that setting just application-group for WSGIScriptAlias when daemon mode not available, still results in preloading.