[Python-Dev] Signals, threads, blocking C functions

David Hopwood david.nospam.hopwood at blueyonder.co.uk
Mon Sep 4 18:19:27 CEST 2006


Gustavo Carneiro wrote:
>   OK, let's review what we know about current python, signals, and threads:
> 
>      1. Python launches threads without touching sigprocmask;
>      2. Python installs signal handlers for all signals;
>      3. Signals can be delivered to any thread, let's assume (because
> of point #1 and not others not mentioned) that we have no control over
> which threads receive which signals, might as well be random for all
> we know;
>      4. Python signal handlers do almost nothing: just sets a flag,
> and calls Py_AddPendingCall, to postpone the job of handling a signal
> until a "safer" time.
>      5. The function Py_MakePendingCalls() should eventually get
> called at a "safer" time by user or python code.
>      6. It follows that until Py_MakePendingCalls() is called, the
> signal will not be handled at all!
> 
>   Now, back to explaining the problem.
> 
>      1. In PyGTK we have a gobject.MainLoop.run() method, which blocks
> essentially forever in a poll() system call, and only wakes if/when it
> has to process timeout or IO event;
>      2. When we only have one thread, we can guarantee that e.g.
> SIGINT will always be caught by the thread running the
> g_main_loop_run(), so we know poll() will be interrupted and a EINTR
> will be generated, giving us control temporarily back to check for
> python signals;
>      3. When we have multiple thread, we cannot make this assumption,
> so instead we install a timeout to periodically check for signals.
> 
>   We want to get rid of timeouts.  Now my idea: add a Python API to say:
>      "dear Python, please call me when you start having pending calls,
> even if from a signal handler context, ok?"

What can be safely done from a signal handler context is *very* limited.
Calling back arbitrary Python code is certainly not safe.

Reliable asynchronous interruption of arbitrary code is a difficult problem,
but POSIX and POSIX implementations botch it particularly badly. I don't
know how to implement what you want here, but I'd endorse the comments of
Nick Maclaren and Antony Baxter against making precipitate changes.

-- 
David Hopwood <david.nospam.hopwood at blueyonder.co.uk>




More information about the Python-Dev mailing list