asynchronous callback
Donn Cave
donn at drizzle.com
Wed Aug 22 01:03:40 EDT 2001
Quoth Silvio Arcangeli <sarcangeli at montrouge.sema.slb.com>:
...
| In my case the callback function should actually be a Python method.
| So I added a C callback function to my extension module: it just converts
| the parameters, and then calls the Python method.
...
| Anyway, the C function correctly retrieves the Python method from the
| dictionary, but then when it calls it it gets blocked.
| I think that this is probably due to the fact that the C callback function
| is called asynchronously (that means it runs in a different thread from the
| interpreter's one).
| How can I make it work?
I don't know if I would have expected it to block, but at any rate,
any healthy callback needs to acquire the interpreter's lock before
proceeding. Here's how mine do it -
/* Before the thread starts, get a thread state object for it. */
PyEval_InitThreads();
tstate = PyThreadState_New(PyThreadState_Get()->interp);
/* From that thread, about to call from C into Python. */
PyEval_AcquireThread(tstate);
/* After Python function returns. */
PyEval_ReleaseThread(tstate);
Meanwhile, of course functions that call out to C for any length
of time must release the interpreter lock first, so your callback
can get it! Usually done with macros, Py_BEGIN_ALLOW_THREADS
and Py_END_ALLOW_THREADS.
I hope that's right, it has been a while since I had to wrestle
with this.
Donn Cave, donn at drizzle.com
More information about the Python-list
mailing list