Остановка потока в python

Как остановить такой поток??? Понятно, что с флагами тут не получится. Смысл такой надо остановить при любом заданном условии (к примеру пользовательский ввод буквы r).

import threading
import time

def one():
    time.sleep(10000)

if __name__ == "__main__":
    run = threading.Thread(target=one, args=())
    run.start()

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Поток нельзя принудительно остановить. Если поток с вами сотрудничает, его можно попросить остановиться. Он остановится когда сочтёт нужным.

Если вы хотите останавливать вычисления принудительно, запустите отдельный процесс. Процессы можно останавливать принудительно.

Питон, если не использовать библиотеки, не умеет реагировать на клавиатуру в реальном времени. Но можно воспользоваться механизмом сигналов и реагировать на нажатие Ctrl-C.

Демонстрация сотрудничающего потока и обработки Ctrl-C:

import signal
import threading
import time


def calc(cancel):
    for _ in range(10):
        if cancel.is_set():
            print('\nCalculation was canceled.')
            return
        time.sleep(1)
        print('.', end='', flush=True)
    print('\nDone')


def run():
    print('run for ten seconds')
    print('Press Ctrl-C to cancel calculation...')

    old_handler = signal.getsignal(signal.SIGINT)

    cancel = threading.Event() 
    thread = threading.Thread(target=calc, args=(cancel, ))

    def handler(signum, frame):
        cancel.set()
        print('\nPress Ctrl-C again to interrupt whole program.')
        signal.signal(signal.SIGINT, old_handler)

    signal.signal(signal.SIGINT, handler)
    thread.start()
    thread.join()
    signal.signal(signal.SIGINT, old_handler)


def quit():
    print('Bye!')
    exit()


def main():
    while True:
        print('\nCommands are:')
        print('    run - runs calculation')
        print('    quit - quits program')
        command = input('> ')
        if command == 'run':
            run()
        elif command == 'quit':
            quit()
        else:
            print('???')


main()
→ Ссылка