Форум сайта python.su
Здравствуйте!
Хочу реализовать веб-доступ через api к rgb-ленте на Raspberry Pi. В качестве фреймворка выбран Flask.
Идея такова, PUT-запрос 1 запускает на rgb-ленте определенный пресет 1, он может длится какое то время, поэтому запускается в отдельном потоке 1, что бы не блокировать сервер. PUT-запрос 2 должен запустить пресет 2, но сначала необходимо остановить пресет 1 (убить поток 1), т.к. поток 1 занимает буфер ленты и продолжает рендерить пресет 1 поверх пресета 2.
Как можно реализовать принудительное завершение потока 1?
Примерный код того что есть.
Заранее благодарю.
Офлайн
Отдельный процесс управляет лентой. Через flask каким нибудь образом этому процессу задается номер пресета, например посылается сигнал, или в сокет, за которым он следи. И не надо никого принудительно завершать. “Добровольно и с песней”" :)
Офлайн
nntndfrk
я бы сделал в главном треде список запущених тредов вида и потом смотрел бы в него и если если нужно убить тред выставлял бы event.set = True, ну а в треде соответсвенно проверял бы установлен евент или нет
Отредактировано sander (Авг. 11, 2016 10:46:43)
Офлайн
@PooH Но если запустить отдельный процесс в виде сокет-сервера и слушать на входе какой пресет запустить, то если он запуститься (какой то длительный во времени), все равно заблокирует основной поток выполнения. Или я не понял механизма?
Офлайн
@sander Я думал над тем, что бы сдельть управление через события, но немогу понять как такой список реализовать
Офлайн
nntndfrkНу я видел так, управляющий лентой поток открывает неблокирующий сокет и дальше в бесконечном цикле: проверил события сокета(не пришла ли команда), выполнил итерацию текущего пресета и так без конца.
@PooH Но если запустить отдельный процесс в виде сокет-сервера и слушать на входе какой пресет запустить, то если он запуститься (какой то длительный во времени), все равно заблокирует основной поток выполнения. Или я не понял механизма?
Офлайн
nntndfrk
создаешь список на уровне модуля и все будет что-то вроде
threads_list = [] @app.route("/") def some_route(): event_for_thread = Event() new_thread = Thread(..., args=(.., event_for_thread) threads_list.append((new_thread, event_for_thread)) ...
Офлайн
**Спасибо всем, кто помогал!**
Сделал с подсказки @sander, но не с threadings, а с multiprocessing, т.к. есть метод process.terminate().
cur_proc_list = [] @app.route("/some_route") def some_route(): if len(cur_proc_list)>0: cur_proc = cur_proc_list.pop() cur_proc.terminate() proc = multiprocessing.Process(target=foo, args=(...)) cur_proc_list.append(proc) proc.start() ...
Офлайн