Callback from c thread with ctypes

Christian Heimes lists at cheimes.de
Sun Mar 8 10:20:42 EDT 2009


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




More information about the Python-list mailing list