views:

111

answers:

2

Hi guys.

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.

+2  A: 

Why do you need this to run in a thread? If you want a separate long-running process, then create one from the command line or a daemon. Or, use something like celery.

Daniel Roseman
I've looked for celery when planning this project, but it's definitely overkill. I need to have a parallel thread because I need to fetch a certain job every X seconds, with X that changes. I to not want to write a command-line or a daemon because this project will be deployed under windows with apache, and having something which goes "with" apache keeps me more relaxed.
Enrico Carlesso
+2  A: 

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.

Graham Dumpleton
That sound like a wonderful hint. Give me some hours to check it!
Enrico Carlesso
Do you know if this trick works in Apache2.2 on windows XP host? mod_wsgi is 3.0 and python 2.6.
Enrico Carlesso
Windows does not support daemons for apache. :( So I'm following the "WSGIImportScript" way. But cannot understand well how to use. WSGIImportScrit "D:/path/django.wsgi" application-group=%{GLOBAL} \n WSGIScriptAlias / "D:/path/django.wsgi" should do the work? Because it tells me that django.wsgi cannot be loaded as Python Module...
Enrico Carlesso