Запустить функцию в отдельном потоке python - PullRequest
1 голос
/ 07 августа 2020

(Python 3.8.3)

Я использую два потока python прямо сейчас, один из которых имеет время True l oop

import threading
def threadOne():
    while True:
        do(thing)
    print('loop ended!')
t1=threading.Thread(threadOne)
t1.start()

И еще один проверяет наличие ввода ctrl + r. Когда я получу, мне нужно, чтобы второй поток сказал первому прервать работу с while l oop. Есть ли способ сделать это?

Обратите внимание, что я не могу изменить l oop на 'while Break == False', поскольку do (thing) ожидает ввода пользователя, но мне нужно, чтобы это было прервано.

1 Ответ

2 голосов
/ 07 августа 2020

Рекомендуемый способ - использовать 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...