Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Web
  • » Взаимодействие потоков между запросами в Flask [RSS Feed]

#1 Авг. 10, 2016 21:22:51

nntndfrk
От: Черновцы
Зарегистрирован: 2014-02-10
Сообщения: 4
Репутация: +  0  -
Профиль   Адрес электронной почты  

Взаимодействие потоков между запросами в Flask

Здравствуйте!
Хочу реализовать веб-доступ через api к rgb-ленте на Raspberry Pi. В качестве фреймворка выбран Flask.
Идея такова, PUT-запрос 1 запускает на rgb-ленте определенный пресет 1, он может длится какое то время, поэтому запускается в отдельном потоке 1, что бы не блокировать сервер. PUT-запрос 2 должен запустить пресет 2, но сначала необходимо остановить пресет 1 (убить поток 1), т.к. поток 1 занимает буфер ленты и продолжает рендерить пресет 1 поверх пресета 2.
Как можно реализовать принудительное завершение потока 1?
Примерный код того что есть.
Заранее благодарю.

Офлайн

#2 Авг. 11, 2016 04:56:00

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Взаимодействие потоков между запросами в Flask

Отдельный процесс управляет лентой. Через flask каким нибудь образом этому процессу задается номер пресета, например посылается сигнал, или в сокет, за которым он следи. И не надо никого принудительно завершать. “Добровольно и с песней”" :)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Авг. 11, 2016 10:46:27

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Взаимодействие потоков между запросами в Flask

nntndfrk
я бы сделал в главном треде список запущених тредов вида и потом смотрел бы в него и если если нужно убить тред выставлял бы event.set = True, ну а в треде соответсвенно проверял бы установлен евент или нет

Отредактировано sander (Авг. 11, 2016 10:46:43)

Офлайн

#4 Авг. 11, 2016 13:16:33

nntndfrk
От: Черновцы
Зарегистрирован: 2014-02-10
Сообщения: 4
Репутация: +  0  -
Профиль   Адрес электронной почты  

Взаимодействие потоков между запросами в Flask

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

Офлайн

#5 Авг. 11, 2016 13:20:20

nntndfrk
От: Черновцы
Зарегистрирован: 2014-02-10
Сообщения: 4
Репутация: +  0  -
Профиль   Адрес электронной почты  

Взаимодействие потоков между запросами в Flask

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

Офлайн

#6 Авг. 11, 2016 16:26:18

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Взаимодействие потоков между запросами в Flask

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



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Авг. 11, 2016 16:42:10

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Взаимодействие потоков между запросами в Flask

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))
    ...

Офлайн

#8 Авг. 12, 2016 08:30:18

nntndfrk
От: Черновцы
Зарегистрирован: 2014-02-10
Сообщения: 4
Репутация: +  0  -
Профиль   Адрес электронной почты  

Взаимодействие потоков между запросами в Flask

**Спасибо всем, кто помогал!**

Сделал с подсказки @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()
	...

Офлайн

  • Начало
  • » Web
  • » Взаимодействие потоков между запросами в Flask[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version