LINUX.ORG.RU

Python два потока

 


1

3

как можно реализовать следующую задачу:

есть два рабочих потока обработки данных

1. выполнят ряд операций с устройствами (читает/пишет в регистры) со постоянно скоростью 0.01-0.1 опр./сек.

2. поток обрабатывает значения этих регистров и реализует логику, формирует интерфейс управления накапливает данные базу

то-есть потоки работают на разных скоростях и скорость взаимодействия потоков через redis не устраивает

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

★★

Первый и он же главный (работает с регистрами по таймеру), пусть пишет через пайп по результатам во второй поток, который на бэкграунде, и во втором потоке пиши в базу.

menangen ★★★★★
()

Поток 1 ставит лок, делает что-то-там с устройствами, снимает лок, ждёт сколько-то там, возвращается к началу цикла.
Поток 2 ждёт пока не освободится лок (кажется такая блокировка называется мьютексом), ставит лок, читает данные из устройств, снимает лок, делает какую-то свою логику, возвращается к началу цикла.
Так что-ли? И тебя не устраивает скорость мьютекса?

MrClon ★★★★★
()
Ответ на: комментарий от Yur4eg

вот про него и думаю, он у меня отличное работает в вебе для сихронизации всяких фигней

fMad ★★
() автор топика
Ответ на: комментарий от menangen

в принципе, с пайпом или очередью или с подписками редиски всё работает синхронно

проблема возникает когда в ход цикла логики вмешивается внешний сигнал

например, http://test@test.ru:2@woodsens.breys.ru/ если нажать нажать на кнопку, то через ajax сигнал приходит во flask очень быстро, затем flask сгенерирует событие редиподписки, тоже очень быстро, от в момент генерации redis события подписки там стоит плотный строй ещё не выполненных итераций

от сюда и получается эффект задержки ручного управления, в то время как автоматическое управление работает как часы

то-есть получается если присутствует внутренняя синхронизация то она рушится если есть внешние сигналы изменяющие логику, потому что у цикла логики получается два источника сигналов

fMad ★★
() автор топика
Последнее исправление: fMad (всего исправлений: 1)
Ответ на: комментарий от Yur4eg

я думаю может проще сделать, два независимых потока, каждый работает на своей скорости

общего между ними только два:

* состояние датчиков-пишет поток устройств

* состояние реле пишет поток логики

нужно как то организовать общие переменные

fMad ★★
() автор топика
Ответ на: комментарий от fMad

asyncio.Queue

«Поток датчиков» как закончил обработку делает put.

А второй поток ждёт await get(), пока не появятся данные.

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

А потом эти люди спрашивают чего мы так любим Go и его channels :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.