Python + Shoutpy + Twisted Locks

Chris Mellon arkanes at gmail.com
Mon Oct 8 16:49:54 EDT 2007


On 10/7/07, Michel Albert <exhuma at gmail.com> wrote:
> On Oct 6, 4:21 am, "Gabriel Genellina" <gagsl-... at yahoo.com.ar> wrote:
> > En Fri, 05 Oct 2007 04:55:55 -0300, exhuma.twn <exh... at gmail.com> 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.



More information about the Python-list mailing list