On May 21, 7:00 pm, Yarko Tymciurak <[email protected]>
wrote:
> On May 21, 3:33 am, Magnitus <[email protected]> wrote:
>
> > But if you create "tasks" without doing it at the OS level, doesn't
> > that means that you won't really be able to take full advantage of
> > multi-processor hardware (since the OS handles the hardware and if the
> > OS doesn't know about it, it won't be able to do the required
> > optimizations with the hardware)?
>
> With the GIL, python itself does not utilize multiple processors, so
> web2py is processor-bound (the only
> effect of multi-core is that the o/s itself can "leave" a core to the
> main python task, e.g.
> it can grab an alternate core... other than that, you're running on
> one core regardless -
> unless you fire multiple instances of python interpreters, in which
> case you are really only
> going to communicate thru services anyway....
>
> See some of the discussion 
> athttp://bugs.python.org/issue7946,http://stackoverflow.com/questions/990102/python-global-interpreter-l...
>
> ... and so forth...
>
>
>
> > Maybe I've done C/C++ for too long and am trying to micro-manage too
> > much, but a solution to I like to use for the problem of creating/
> > tearing down process threads is just to pre-create a limited number of
> > them (optimised for the number of CPUs you have) and recycle them to
> > do various tasks as needed.
>
> Well - since you don't have that with python, you run the risk of I/O
> blocking .... which is why really lightweight
> tasklets are so desireable (CCP Games 
> runshttp://en.wikipedia.org/wiki/Eve_Online
> with many tens of thousands of simultaneous users, if I recall
> correctly, and maintain stackless for this purpose).
>
>
>
> > Of course, that works best when you give your threads/processes longer
> > tasks to perform in parallel (else, the extra cost of managing it will
> > probably outweight the benefits of running it in parallel).
>
> There is much to cover in this - and I suppose reason to be happy that
> python traditionally hasn't run multi-core.
> See, for example, the discussions 
> at:http://stackoverflow.com/questions/203912/does-python-support-multipr...
>
> andhttp://docs.python.org/library/multiprocessing.html
>
> Lots to read! ;-)

Also read:

  http://blog.dscpl.com.au/2007/07/web-hosting-landscape-and-modwsgi.html
  http://blog.dscpl.com.au/2007/09/parallel-python-discussion-and-modwsgi.html

BTW, your prior descriptions about how web2py works under mod_wsgi
aren't overly accurate. You said:

"""
In a hosting environment, you have apache/wsgi (for example) running
a
wsgi-thred that is web2py - that (main and the stuff in gluon) is
your
long-running process (er, thread).   To restart web2py, with wsgi,
you
would do what is normal (touch a file) to cause apache to re-start
that wsgi thread.

Within web2py, you have a number of threads:  db connection pools,
and
application threads;   again, these respond to requests, and are
spawned off by web2py (not you)
"""

When run under Apache/mod_wsgi there is not a thread that is dedicated
to web2py and web2py doesn't have its own threads to respond to
requests.

In each Apache or mod_wsgi daemon process, depending on whether you
are using embedded mode or daemon mode, there is a pool of threads.
These are C threads, not Python threads and the thread pool is managed
by Apache or mod_wsgi as appropriate.

How a connection is accepted depends on Apache MPM or mod_wsgi mode
being used, but ultimately one of the threads in the thread pool
processes the request, all still in C code. For embedded mode the
request may not even be for the WSGI application but be for a static
file or other dynamic application such as PHP. If daemon mode, or if
target of request was the WSGI application, only then does Python GIL
get acquired and the thread tries to call into the WSGI application as
an external thread calling into the embedded Python interpreter.

At this point the WSGI application may not have even been loaded, so
the first request to find that has to load the WSGI script file which
may in turn load web2py. In this case web2py doesn't do anything
special. That is, it doesn't go creating its own thread pool and it
actually must return immediately once it is loaded and initialised.
Once it returns, the thread calls into the WSGI application entry
point and web2py handles the request. Any response is thence passed
back through Apache with the GIL being released at each point where
this occurs. When complete request is done, the GIL is completely
released and thread becomes inactive again pending a further request.

If other requests occur at the same time, they could also call into
web2py. The only choke point is the initial loading of the WSGI script
as obviously only want to allow one thread to do that.

So, web2py doesn't have its own request threads and all calls come in
from a external threads managed by Apache or mod_wsgi.

Graham

> - Yarko
>
>
>
>
>
> > On May 20, 2:12 pm, Yarko Tymciurak <[email protected]>
> > wrote:
>
> > > On May 19, 6:18 pm, Yarko Tymciurak <[email protected]>
> > > wrote:
>
> > > > On May 19, 5:41 pm, amoygard <[email protected]> wrote:
>
> > > ....
>
> > > > So - in general, you do not start subprocesses - with the exception of
> > > > cron.   Seehttp://www.web2py.com/book/default/section/4/17
>
> > > I might better have said you do not _want_ to be starting subprocesses
> > > - besides the cost (compute time, memory, etc.), if you generally did
> > > this.   This (the inneficiency of spawning subrocesses) is why
> > > stackless  was created - and (among other things) used in a a very
> > > busy online game.  A lot of thought went into avoiding the costs of
> > > spawning subprocesses.
>
> > > If you haven't heard of it, stackless is an implementation of python
> > > that does not use the traditional "C" stack for local variables,
> > > etc.   Among other things, it has added "tasklets" to the language, so
> > > you can create and schedule tasks - without the overhead of doing so
> > > in your operating system.   There is a lot of discussion of benefit,
> > > efficiency.   Although there might be some discussion questioning the
> > > approach, other alternative approaches, one thing is clear:  the
> > > motivation to stay away from creating threads / subprocesses, and the
> > > costs involved.  it might be interesting to read up on it.
>
> > > - Yarko
>
> > > > - Yarko

Reply via email to