Рекомендуемый способ - использовать threading.event (вы можете комбинировать это с event.wait, если вы тоже хотите спать в этом потоке, но, поскольку вы ждете пользовательского события, вероятно, это не нужно).
import threading
e = threading.Event()
def thread_one():
while True:
if e.is_set():
break
print("do something")
print('loop ended!')
t1=threading.Thread(target=thread_one)
t1.start()
# and in other thread:
import time
time.sleep(0.0001) # just to show thread_one keeps printing
# do something for little bit and then it break
e.set()
EDIT: чтобы прервать поток , пока он ожидает ввода пользователя , вы можете отправить SIGINT в этот поток, и он вызовет KeyboardInterrupt, который вы затем можете обработать. К сожалению, ограничение python, включая python3, заключается в том, что сигналы для всех потоков обрабатываются в основном потоке, поэтому вам нужно дождаться ввода пользователя в основном потоке:
import threading
import sys
import os
import signal
import time
def thread_one():
time.sleep(10)
os.kill(os.getpid(), signal.SIGINT)
t1=threading.Thread(target=thread_one)
t1.start()
while True:
try:
print("waiting: ")
sys.stdin.readline()
except KeyboardInterrupt:
break
print("loop ended")