Callback from c thread with ctypes

Victor Lin Bornstub at gmail.com
Sun Mar 8 10:28:55 EDT 2009


On 3月8日, 下午10時20分, Christian Heimes <li... at cheimes.de> 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?

Thanks.



More information about the Python-list mailing list