exec code with timeout?
Paul Moore
pf_moore at yahoo.co.uk
Mon Sep 8 17:18:12 EDT 2003
Paul Moore <pf_moore at yahoo.co.uk> writes:
> If
> 1. You run the code you want to interrupt in the main thread
> 2. You don't mind the interrupt being a KeyboardInterrupt exception
>
> then you can write the code in pure Python, as follows:
A module to wrap PyThreadState_SetAsyncExc isn't exactly hard, either.
Here's one in its entirety (async.c). I'm not sure I believe the
argument in the reference manual that this function is not exposed to
Python to avoid accidental mistakes - why not expose it, but with a
suitably "internal" name, and documentation warnings (much like
sys._getframe). It could easily be thread._async_exc(), for example.
Anyway, here's the code if it's of any interest...
Paul
#include <Python.h>
static PyObject *
async_exc(PyObject *self, PyObject *args)
{
PyObject *exc;
int id;
int n;
if (!PyArg_ParseTuple(args, "iO:async_exc", &id, &exc))
return NULL;
n = PyThreadState_SetAsyncExc(id, exc);
if (n > 1) {
/* Problem - clear the exception... */
PyThreadState_SetAsyncExc(id, NULL);
return NULL;
}
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef ModuleMethods[] = {
{"async_exc", async_exc, METH_VARARGS,
"Raise an exception in the given thread."},
{NULL, NULL, 0, NULL} /* Sentinel */
};
PyMODINIT_FUNC
initasync(void)
{
Py_InitModule("async", ModuleMethods);
}
--
This signature intentionally left blank
More information about the Python-list
mailing list