Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it ok to spawn threads in a wsgi-application?

To achieve something similar to google app engines 'deferred calls' (i.e., the request is handled, and afterwards the deferred task is handled), i experimented a little and came up with the solution to spawn a thread in which my deferred call is handled.

I am now trying to determine if this is an acceptable way.

Is it possible (according to the WSGI specification) that the process is terminated by the webserver after the actual request is handled, but before all threads run out?

(if there's a better way, that would be also fine)

like image 279
keppla Avatar asked Jul 05 '11 07:07

keppla


People also ask

Is Wsgi multithreaded?

It is possible that a WSGI application could be executed at the same time from multiple worker threads within the one child process. This means that multiple worker threads may want to access common shared data at the same time.

What is spawn in thread?

Function std::thread::spawnSpawns a new thread, returning a JoinHandle for it. The join handle provides a join method that can be used to join the spawned thread. If the spawned thread panics, join will return an Err containing the argument given to panic! .


2 Answers

WSGI does not specify the lifetime of an application process (as WSGI application is a Python callable object). You can run it in a way that is completely independent of the web server, in which case, only you control the lifetime.

There is also nothing in the WSGI that would prohibit you from spawning threads, or processes, or doing whatever the hell you want.

like image 157
Cat Plus Plus Avatar answered Oct 21 '22 21:10

Cat Plus Plus


FWIW, also have a read of:

http://code.google.com/p/modwsgi/wiki/RegisteringCleanupCode

The hooking of actions to close() of iterable is the only way within context of the WSGI specification itself for doing deferred work. That isn't in a separate thread though and would occur within the context of the actual request, albeit after the response is supposed to have been flushed back to the client. Thus your deferred action will consume that request thread until the work is complete and so that request thread would not be able to handle other requests until then.

In general, if you do use background threads, there is no guarantee that any hosting mechanism would wait until those background threads complete before shutting process down. In fact, can't even think of any standard deployment mechanism which does wait. There isn't really even a guarantee that atexit handlers will be called on process shutdown, something that the referenced documentation also briefly talks about.

like image 24
Graham Dumpleton Avatar answered Oct 21 '22 21:10

Graham Dumpleton