Я сомневаюсь, что это можно сделать.
Если вы хотите реализовать это без какого-либо опроса, то вам нужно, чтобы ОС знала, что поток заблокирован, и ОС должна знать время ожидания, чтобы через некоторое время разблокировать поток. Для этого поддержка должна уже существовать в ОС; Вы не можете реализовать это на уровне Python.
(Вы можете заблокировать поток на уровне ОС или на уровне приложения и иметь механизм, с помощью которого он может быть вызван другим потоком в соответствующее время, но тогда вам нужен этот другой поток для эффективного опроса )
В общем, у вас все равно нет действительно ограниченной гарантии ожидания / прогресса блокировки, поскольку вашему потоку придется ждать неограниченное время, пока не произойдет переключение контекста, чтобы он заметил, что он разблокирован. Таким образом, если вы не сможете установить верхнюю границу количества конфликтов процессора, вы не сможете использовать тайм-аут, чтобы уложиться в какие-либо жесткие сроки в реальном времени. Но вам, вероятно, это не нужно, иначе вы не мечтали бы использовать блокировки, реализованные в Python.
Из-за Python GIL (Global Interpreter Lock) эти основанные на опросе решения, вероятно, не столь неэффективны или не столь безграничны, как вы думаете (в зависимости от того, как они реализованы) (и при условии, что вы используете либо CPython или PyPy).
В каждый момент времени работает только один поток, и по определению есть еще один поток, который вы хотите запустить (тот, который содержит блокировку, которую вы ожидаете). GIL некоторое время удерживается одним потоком для выполнения группы байт-кодов, затем отбрасывается и повторно запрашивается, чтобы дать кому-то еще шанс. Таким образом, если поток с блокированным тайм-аутом находится в цикле, проверяющем время и уступающем другим потокам, он будет просыпаться только изредка, когда получит GIL, а затем почти сразу же отбросит его обратно кому-то еще и заблокирует Джил снова. Поскольку этот поток может когда-либо проснуться только тогда, когда он получит поворот в GIL, он также выполнит эту проверку, как только истечет время ожидания, так как он сможет возобновить выполнение, даже если время ожидания было волшебно совершенным.
Единственный раз, когда это приведет к значительной неэффективности, это если ваш поток заблокирован в ожидании потока, удерживающего блокировку, который заблокирован в ожидании чего-то, что не может быть вызвано другим потоком Python (скажем, заблокированным в IO) и нет никаких других запущенных потоков Python. Тогда ваш тайм-аут опроса действительно будет просто сидеть и проверять время, что может быть плохо, если вы ожидаете, что эта ситуация произойдет в течение длительного периода времени.