I'm trying to prototype an application which runs multiple python scripts, each in its own interpreter and OS thread. I've not been able to forceable stop a script which does not respond to a request to stop.
My thought was to simply call: PyThreadState_Clear(xxx); PyThreadState_Delete(xxx); // Fatal Python error: no last thread Py_EndInterpreter(xxx); But, this doesn't work. The call to delete causes a fatal error. If I skip the call to delete, the call to EndInterpreter() ends but seg faults abound afterwards. A small sample follows. I've googled my heart out and reread the threading API countless times. Any suggest or hints would be greatly appreciated. ---- #include "Python.h" #include <stdio.h> #include <unistd.h> #include <pthread.h> PyThreadState *gtstate; void * mythread( void *none ) { PyEval_AcquireLock(); gtstate = Py_NewInterpreter(); PyRun_SimpleString( "import time\nwhile 1:\n\tprint \"I won't stop\"\n\ttime.sleep(1.0)\n" ); printf( "Interpreter was shutdown ... yeah \n" ); PyEval_ReleaseLock(); } int main(int argc, char *argv[] ) { pthread_t thread; PyThreadState *tstate; Py_Initialize(); PyEval_InitThreads(); tstate = PyEval_SaveThread(); pthread_create( &thread, (pthread_attr_t *)NULL, mythread, NULL ); sleep(3); /* Make that pesky script die */ printf( "die ... \n" ); PyEval_AcquireLock(); PyThreadState_Clear(gtstate); //PyThreadState_Delete(gtstate); // Fatal Python error: Py_EndInterpreter: not the last thread PyThreadState_Swap(gtstate); Py_EndInterpreter(gtstate); PyEval_ReleaseLock(); sleep(3); // Segmentation fault PyEval_AcquireThread(tstate); Py_Finalize(); return(0); } -- http://mail.python.org/mailman/listinfo/python-list