Как начать выполнять функцию в другом потоке? Python

Рейтинг: 2Ответов: 2Опубликовано: 25.02.2023

Проблема состоит в следующем. У меня есть функция(view_tasks), в которой есть бесконечный цикл, который прекратит своё выполнение при получении сообщения от пользователя в чат-боте. Мне нужно добавить эту функцию в другой поток, чтобы не загружать бота. Иначе получается так, что бот ждёт выполнения этой функции от конкретного пользователя и не может отвечать другому.

Пример:

def view(message, task):
    os.chdir(BASE)
    photo = {'photo': open(f"{task[4]}\{task[1]}", 'rb')}
    text = f"Номер вопроса: {task[0]}. Вам даётся {task[2]} минуты."
    requests.post(f'{URL}{BOT_TOKEN}/sendPhoto?chat_id={message.chat.id}&caption={text}', files=photo)

def wait_answer(message, q):
    answers[q] = "+"
    answer[q] = message.text

def view_tasks(message):
    stop = 0
    for task in tasks:
        if stop == 1: break
        view(message, task)
        printy(message.chat.id, "Введите ответ (число или пара чисел, записанных через пробел)")
        while answers[int(task[0])] == "-":
            if datetime.now() > dt_time_stop:
                printy(message.chat.id, f"Время кончилось. Вариант {number} отправлен на проверку")
                stop = 1
                break
            bot.register_next_step_handler(message, wait_answer, int(task[0]))
            time.sleep(3)

Ответы

▲ 1Принят

Можно использовать класс threading.Thread:

from threading import Thread


def f():
    while True:
        pass  # Что-то


t = Thread(target=f)
t.start()

Подробнее в документации.

▲ 0

Можно с помощью multiprocessing.Precess:

from multiprocessing import Process

def f():
    print('hello')

if __name__ == '__main__':
    p = Process(target=f)
    p.start()
    p.join()

Вывод:

hello

У Process есть один плюс:

можно передать аргумент args:

from multiprocessing import Process

def f(name):
    print('hello, ', name)

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

Вывод:

hello, bob

https://docs.python.org/3/library/multiprocessing.html#the-process-class