Callback from c thread with ctypes

Victor Lin Bornstub at
Sun Mar 8 15:28:55 CET 2009

On 3月8日, 下午10時20分, Christian Heimes <li... at> wrote:
> Victor Lin wrote:
> > Hi,
> > I am going to develop a c library binding with ctypes. That c library
> > will call callback from worker threads it created. Here comes the
> > problem : Will the GIL be acquired before it goes into Python
> > function?
> > I got a little try..
> > DSPPROC = WINFUNCTYPE(None, DWORD, DWORD, c_void_p, DWORD, c_void_p)
> > def test(handle, channel, buffer, length, user):
> >     print handle, channel, buffer, length, user
> > dsp = BASS_ChannelSetDSP(stream, DSPPROC(test), None, 123)
> > I got "access violation" when I run it... It seems that the ctypes
> > did't acquire GIL before it call the python callback. As the document
> > says.
> > WINFUNCTYPE will release GIL during the call
> > But it does not mention callback about Python function? How about a
> > call from another thread? Could somebody help me?
> You can't call Python code from an arbitrary thread. Before you are
> allowed to call a Python function from a thread, you must enable
> Python's threading subsystem and register the thread. Python need to
> store information (like the exception information) in a thread local
> variable (TLS).
> I can't tell you how to register your thread with Python, though.
> Christian

I know I have to call PyEval_InitThreads if my module create threads
that will contact python stuff, for example, call a python callback
function from threads. But however, it is ctypes. I have no idea
should I do that for the imported dll? If it is, how?


More information about the Python-list mailing list