Kosist писал(а): ↑29 апр 2021, 15:18
jane_wild писал(а): ↑29 апр 2021, 14:34
Возможно ли как то получать информацию о количестве сообщений в очереди, от кого они были посланы? Может вообще можно эту самую очередь очистить?
Спасибо.
Стандартными способами - нельзя ни узнать инфу о количестве сообщений, ни очистить очередь.
Пытаюсь скрестить синхронные и асинхронные действия.
Немного размышлений по акторам
Actor Core – ждет сообщения из очереди Send-To-Self Enqueuer
При нормальной работе актор не выходит из цикла.
Выполнить какие либо действия можно только в этом цикле и только через очередь. Не используя очередь передать данные нельзя. Не передав сообщение Актору он будет все время в ожидании сообщения.
Выполнить действие (Do) по заранее определенному заданию нельзя не отправив сообщение. Таким образом смешивается очередь сообщений и очередь заданий.
Для организации периодически выполняемых действий, например чтение данных необходимо сделать вспомогательный цикл синхронизации, который будет отправлять самому себе сообщение о выполнении необходимого действия.
Поставить в очередь «синхроимпульс» можно. Однако если актор притормозил нужен только один последний. Нет возможности не закидывать актора сообщениями стандартным способом. Это основной принцип Actor Framework, инкапсуляция очереди.
Приоритеты не поддерживаются стандартной очередью Labview. Автору пришлось сильно постараться с классом Priority Queue. Что не может не вызвать дополнительные накладные расходы при постановке в очередь и чтение очереди.
Работа в RT системах. Не нашел опыта применения.
Накладые расходы на инкапсуляцию очереди и создание приоритетов
Я поместил очередь в Actor без класса Message Enqueuer. Так же упростил Priority Queue убрав приоритеты, как было в первоначальных версиях по словам автора.
Т.е. переделал классы Actor и Меssage.
Производительность возросла в 10 раз. Таким образом оплата за инкапсуляцию и(или) приоритеты - уменьшение производительности в 10 раз
В этом тесте я отправлял целое число в виде и контролировал через DVR что число приходит. Одновременно запустил 10 000 акторов.
Переделанные классы без приоритетов и инкупсуляции очереди
Так же непонятно назначение классов Message Dequeuer.lvclass и Message Queue.lvclass
В описании для использования только в акторе верхнего уровня. В примерах и библиотеке данные классы нигде не использованы.
Вопрос 1. Как более правильно организовать периодически повторяющиеся действия?
Вопрос 2. Как не записывать в очередь сообщение с «синхроимпульсом» если этот тип сообщений уже есть в очереди? Кроме уже упомянутого способа организовать еще одну внутреннюю очередь и еще одного принимающего актора.
Вопрос 3. Есть опыт применения в RT (На NI LinuxRT)?