I have an embedded Python program which runs in a thread in C.
When the Python interpreter switches thread context (yielding control to
another thread), I'd like to be notified so I can perform certain necessary
operations.
It seems that Py_AddPendingCall is exactly what I'm looking for. However, the
API docs are pretty brief on this function, and I'm confused as to how
Py_AddPendingCall is supposed to be used. From reading the docs, my
understanding is that:
(1) A worker thread calls Py_AddPendingCall and assigns a handler function.
(2) When the Python interpreter runs, it calls the handler function whenever it
yields control to another thread
(3) The handler itself is executed in the main interpreter thread, with the GIL
acquired
I've googled around for example code showing how to use Py_AddPendingCall, but
I can't find anything. My own attempt to use it simply doesn't work. The
handler is just never called.
My worker thread code:
const char* PYTHON_CODE =
"while True:\n"
" for i in range(0,10): print(i)\n"
"\n";
int handler(void* arg)
{
printf("Pending Call invoked!\n");
abort();
}
void worker_thread()
{
PyGILState_STATE state = PyGILState_Ensure();
Py_AddPendingCall(&handler, NULL);
PyRun_SimpleString(PYTHON_CODE);
PyGILState_Release(state);
}
In this example, worker_thread is invoked in C as a pthread worker thread. This
loops infinitely, but the pending call handler is never invoked.
So,obviously I'm not understanding the docs correctly. How is
Py_AddPendingCall is supposed to be used?
--
http://mail.python.org/mailman/listinfo/python-list