У меня есть следующий пример игрушки для Python модуля потоков
from __future__ import print_function
import threading
import time
import signal
import sys
import os
import time
class ThreadShutdown(Exception):
# Custom exception to allow clean thread exit
pass
def thread_shutdown(signum, frame):
print(" o Signal {} caught and raising ThreadShutdown exception".format(signum))
raise ThreadShutdown
def main():
"""
Register the signal handlers needed to stop
cleanly the child accessing thread
"""
signal.signal(signal.SIGTERM, thread_shutdown)
signal.signal(signal.SIGINT, thread_shutdown)
test_run_seconds = 120
try:
thread = ChildThread()
thread.start()
time.sleep(1)
while test_run_seconds > 0:
test_run_seconds -= 1
print(" o [{}] remaining time is {} seconds".format(time.asctime( time.localtime(time.time()) ), test_run_seconds))
time.sleep(1)
except ThreadShutdown:
thread.shutdown_flag.set()
thread.join()
print(" o ThreadShutdown procedure complete")
return
proc.terminate()
thread.shutdown_flag.set()
thread.join()
print(" o Test terminated")
class ChildThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.shutdown_flag = threading.Event()
def run(self):
while not self.shutdown_flag.is_set():
print(" o [{}] is the current time in child, sleep for 10s".format(time.asctime( time.localtime(time.time()))))
time.sleep(10)
return
if __name__ == "__main__":
sys.exit(main())
, который ведет себя как ожидалось (основной поток считает каждую секунду, в то время как порожденный поток печатает только каждые 10 секунд.
Я пытался понять поведение того же фрагмента кода при наличии блокирующих ожиданий в режиме ядра в порожденном потоке. Например, предположим, что порожденный поток теперь переходит в ожидаемое уничтожение в ioctl со временем ожидания 10 с, я все равно будет ожидать, что основной поток будет считать каждую секунду. По какой-то причине он считает каждые 10 секунд, как если бы он также был заблокирован в ожидании порожденного потока. В чем причина?