Найти - Пользователи
Полная версия: Взаимодействие потоков между запросами в Flask
Начало » Web » Взаимодействие потоков между запросами в Flask
1
nntndfrk
Здравствуйте!
Хочу реализовать веб-доступ через api к rgb-ленте на Raspberry Pi. В качестве фреймворка выбран Flask.
Идея такова, PUT-запрос 1 запускает на rgb-ленте определенный пресет 1, он может длится какое то время, поэтому запускается в отдельном потоке 1, что бы не блокировать сервер. PUT-запрос 2 должен запустить пресет 2, но сначала необходимо остановить пресет 1 (убить поток 1), т.к. поток 1 занимает буфер ленты и продолжает рендерить пресет 1 поверх пресета 2.
Как можно реализовать принудительное завершение потока 1?
Примерный код того что есть.
Заранее благодарю.
PooH
Отдельный процесс управляет лентой. Через flask каким нибудь образом этому процессу задается номер пресета, например посылается сигнал, или в сокет, за которым он следи. И не надо никого принудительно завершать. “Добровольно и с песней”" :)
sander
nntndfrk
я бы сделал в главном треде список запущених тредов вида и потом смотрел бы в него и если если нужно убить тред выставлял бы event.set = True, ну а в треде соответсвенно проверял бы установлен евент или нет
nntndfrk

@PooH Но если запустить отдельный процесс в виде сокет-сервера и слушать на входе какой пресет запустить, то если он запуститься (какой то длительный во времени), все равно заблокирует основной поток выполнения. Или я не понял механизма?

nntndfrk

@sander Я думал над тем, что бы сдельть управление через события, но немогу понять как такой список реализовать

PooH
nntndfrk
@PooH Но если запустить отдельный процесс в виде сокет-сервера и слушать на входе какой пресет запустить, то если он запуститься (какой то длительный во времени), все равно заблокирует основной поток выполнения. Или я не понял механизма?
Ну я видел так, управляющий лентой поток открывает неблокирующий сокет и дальше в бесконечном цикле: проверил события сокета(не пришла ли команда), выполнил итерацию текущего пресета и так без конца.
sander
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))
    ...
nntndfrk
**Спасибо всем, кто помогал!**

Сделал с подсказки @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()
	...
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB