Как начать выполнять функцию в другом потоке? Python
Проблема состоит в следующем. У меня есть функция(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)
Ответы (2 шт):
Автор решения: wchistow
→ Ссылка
Можно использовать класс threading.Thread:
from threading import Thread
def f():
while True:
pass # Что-то
t = Thread(target=f)
t.start()
Подробнее в документации.
Автор решения: nchistov
→ Ссылка
Можно с помощью 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