[Python-ideas] Protecting finally clauses of interruptions (original) (raw)

Victor Stinner victor.stinner at gmail.com
Sat Apr 7 12:04:28 CEST 2012


I'd like to propose a way to protect finally clauses from interruptions (either by KeyboardInterrupt or by timeout, or any other way).

With Python 3.3, you can easily write a context manager disabling interruptions using signal.pthread_sigmask(). If a signal is send, the signal will be waiting in a queue, and the signal handler will be called when the signals are unblocked. (On some OSes, the signal handler is not called immediatly.)

pthread_sigmask() only affects the current thread. If you have two threads, and you block all signals in thread A, the C signal handler will be called in the thread B. But if I remember correctly, the Python signal handler is always called in the main thread.

pthread_sigmask() is not available on all platforms (e.g. not on Windows), and some OSes have a poor support of signals+threads (e.g. OpenBSD and old versions of FreeBSD).

Calling pthread_sigmask() twice (enter and exit the final block) has a cost, I don't think that it should be done by default. It may also have unexpected behaviours. I prefer to make it explicit.

--

You may hack ceval.c to not call the Python signal handler in a final block, but system calls will still be interrupted (EINTR).

Victor



More information about the Python-ideas mailing list