On 10/7/07, Michel Albert <[EMAIL PROTECTED]> wrote: > On Oct 6, 4:21 am, "Gabriel Genellina" <[EMAIL PROTECTED]> wrote: > > En Fri, 05 Oct 2007 04:55:55 -0300, exhuma.twn <[EMAIL PROTECTED]> escribi?: > > > > > [...] What I found > > > is that "libshout" is blocking, which should be fine as the whole > > > thing runs in it's separate thread. But the application hangs > > > nevertheless while streaming. This effectively blocks out the other > > > thread that checks the player status, which then fails to append new > > > songs to the queue. So only one song is played when streaming. > > > > > The other threads in my application run fine and don't block the rest > > > of the app. So I guess, that the main problem is that blocking occurs > > > "outside" the python world and "inside" the libshout world. > > > > Only one thread at a time may be executing Python code; the Global > > Interpreter Lock (GIL) ensures the mutual exclusion. Extension modules > > (written in C) may use the macros > > Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS to release/acquire the GIL > > before/after an external blocking call. > > I don't know libshout, or how you are doing the binding python-libshout, > > but if your analysis is correct it means that the code is not releasing > > the GIL at the appropiate points. > > > > -- > > Gabriel Genellina > > Hmmm... ok. I suppose rewriting the whole thing using twisted's > deferreds could then solve the problem. Which are basically nothing > more than callbacks with a weird name ;) Unfortunately this means that > I have to re-think a lot. But in the end I suppose it will pay off. > > Thanks for taking the time and reading my little essay Gabriel ;) >
Using Twisted won't help if the libshout calls are really blocking the main thread. You need to fix the libshout wrapper to release the GIL when it makes blocking C calls. I also believe that Twisted has a native (perhaps only semi-functional?) shoutcast protocol implementation, so a pure-python implementation might be possible as well. -- http://mail.python.org/mailman/listinfo/python-list