Python потоков и linux ioctl ожидания - PullRequest
0 голосов
/ 27 января 2020

У меня есть следующий пример игрушки для 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 секунд, как если бы он также был заблокирован в ожидании порожденного потока. В чем причина?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...