Запустить параллельно несколько экземпляров

Темы связанные с инженерными разработками, но не подходящие в другие ветки форума
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Запустить параллельно несколько экземпляров

Сообщение Boris_K »

Никак не могу запустить из верхнеуровневого :vi: несколько экземпляров другого :vi: (должны работать независимо, у каждого свой набор данных). У него есть входы для параметров запуска, а выходов нет, то есть каждый экземпляр нужно вызвать 1 раз и "забыть", а верхнеуровневый :vi: продолжает выполняться параллельно. Пробовал запустить экземпляры в обычном цикле For, но просто выполняется первый, а остальные стоят, пока он не завершится, это естественно. Если же на блок-диаграмме явно размножить эти клоны (и все линии на их входы явно развести) - то всё работает как надо. Но это не вариант, клонов нужно довольно много.

По идее нужно через Start asynchronous call, так же в цикле, но не получается.
Race conditions - опасный и скользкий баг!
Artem.spb

Activity Автор
professor
professor
Сообщения: 3392
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Запустить параллельно несколько экземпляров

Сообщение Artem.spb »

Asynchronous Call and Forget.vi в стандартных примерах.
Возможно не корректные ключи запуска.
Кидайте ваш код, починим.
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Запустить параллельно несколько экземпляров

Сообщение Boris_K »

Если кратко, VI-клоны собирают информацию и пишут в файл, каждый клон пишет в свой файл.

Сделал Asynchronous Call как в примере. Вроде всё работает (экземпляры шлют нотификаторы со статистикой в верхнеуровневый :vi: , судя по ним, всё пашет). Но файлов с результатами почему-то нет. При любых других способах вызова клонов - всё отлично, файлы есть. Код выложить проблематично, будет время - сделаю пример и выложу. Навскидку не подскажете, почему может быть так?

Нашёл другой способ - просто запуск в цикле For, у которого настроил параллелизм. Тут всё работает, файлы создаются, думаю так оставлю.
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Запустить параллельно несколько экземпляров

Сообщение dadreamer »

> Но файлов с результатами почему-то нет.
SubVI есс-но реентерантный? До кучи надо указать опцию 08 или 40, сходу не помню, какую. Ну, и имена файлов тоже должны отличаться - можно взять имя клона или рандом.
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Запустить параллельно несколько экземпляров

Сообщение Boris_K »

Да, реентерантный (preallocated clone). Имена файлов конечно отличаются. Опция изначально стояла 0x80 (согласно хелпу), пробовал добавить 0x40 и 0x08 - не помогло.
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Запустить параллельно несколько экземпляров

Сообщение dadreamer »

Выкладывайте упрощенный пример, посмотрим.
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Запустить параллельно несколько экземпляров

Сообщение Boris_K »

Вот простой пример на 2 экземпляра. Запустить _writer_test.vi.

Ещё не понятно, почему после выхода из головного :vi: в памяти остаются работающими какие-то :vi: Этого быть никак не должно, ведь они завершаются по сигналу нотификатора, и так и происходит при любом другом способе вызова.

Сейчас ещё поковыряю, посмотрю ошибки, почему файлы не пишутся.
Вложения
async_call.zip
(25.7 КБ) 185 скачиваний
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Запустить параллельно несколько экземпляров

Сообщение dadreamer »

Файлы пишутся, если открыть в блокноте, то это видно. Винда не всегда обновляет размер в проводнике. А по поводу "неостановки" клонов - нотифаеры надо уничтожать в основном :vi: , а SubVI закрывать не только по статусу True, а ещё и по ошибке. Сейчас получается так, что когда Main остановлен, :labview: уничтожает нотифаеры, а в клоне попытка чтения приводит к ошибке 1. Раз ошибка, то и статус False (дефолт), вот и не останавливается.
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Запустить параллельно несколько экземпляров

Сообщение Boris_K »

1) Это что вы в блокноте открывали? :shok: У меня они вообще не создаются, сколько ни обновляй папку.
2) Насчёт нотифаеров в справке написано, что notifier refnum действует в пределах application instance, а не в пределах родительского :vi: Нигде не написано, что родительский :vi: при завершении удаляет созданные нотифаеры.
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Запустить параллельно несколько экземпляров

Сообщение dadreamer »

> У меня они вообще не создаются, сколько ни обновляй папку.
Хм, странно. А почему у вас такое необычное открытие файла? Есть же стандартный Open File.

> Насчёт нотифаеров что-то не то. Ведь при любом другом способе вызова :vi: (либо явно, либо в цикле For с параллелизмом) - всё работает как надо, вызванные subVI останавливаются (проверял, вышли ли они из цикла). Да и в справке написано, что notifier refnum действует в пределах application instance, а не в пределах родительского :vi:
И в текущем случае _иногда_ работает как надо, но не всегда. Вы можете сами это проверить, выведя error out из Get Notifier Status и отобразив панель SubVI при запуске. App Instance - это экземпляр в рамках проекта. Если :vi: не содержатся в проекте, они помещаются в отдельный App Instance. Я думаю, здесь как-то так: в Main нет закрытия нотифаеров, а SubVI запускаются с флагом "забыть". После отработки Main :labview: выполняет очистку памяти, удаляя нотифаеры (про клоны он "забыл"). Поэтому ссылки становятся недействительны (ошибка 1).

И таки да, чистка всегда выполняется по окончании работы :vi: . Это логично, и кроме того легко проверяется. Поместите на БД Obtain Notifier и нажмите Run Continuously. Если бы чистки не было, мы бы наблюдали в диспетчере задач постоянное увеличение объема занятой памяти. Но этого не происходит.
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Запустить параллельно несколько экземпляров

Сообщение Boris_K »

> А почему у вас такое необычное открытие файла? Есть же стандартный Open File.
По идее тут нет принципиальной разницы, как создавать. Мне показалось так чуть удобнее.

По нотификаторам получается в справке как-то мутно всё описано. Например там есть вот: "To destroy a notifier, ... or stop all VIs using the notifier reference". Вот я и думал, что пока есть работающие VI, которые используют нотификатор, он не удаляется. А получается не так.

З. Ы. Вы тестили наверное не в 2012 версии? Видимо, тут действительно какой-то баг.
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Запустить параллельно несколько экземпляров

Сообщение Boris_K »

Поковырял writer_unit. Оказывается, уже Application Directory VI выдаёт < Not a path >, вот файлы и не записываются. Согласно справке, такое было бы, если бы :vi: не был сохранён на диске. Но он сохранён. И странно что у вас они пишутся. Другая версия :labview: ?
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Запустить параллельно несколько экземпляров

Сообщение dadreamer »

Файлы исправно пишутся, проверял на :labview: 2016-2017 (64 бита) на двух машинах с W7-W10. С нотифаерами тоже вроде всё понятно, сам давно их использую, нареканий нет. Единственное, что мне не совсем понятно, почему в справке не написано, что при использовании 0x80 (call and forget) клон становится вне области App instance (даже при добавлении всех ВИ-аек в проект). Может, где-то есть статейка, сходу не нашёл. Вот здесь была аналогичная ситуация: https://forums.ni.com/t5/LabVIEW/Close- ... 21#M990609 Предлагаю не париться, а просто сделать, как я всегда делаю - статус Stop-уведомителя проверяется через ИЛИ - True ИЛИ Ошибка. Если ссылка недействительна (Main остановлен), дальше работать не имеет смысла и программа (т.е., все саб-ВИ) должна остановиться. Если уведомитель не для стопа, а какой-то другой - обрабатывать error-кластер.
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Запустить параллельно несколько экземпляров

Сообщение Boris_K »

Получается что поведение Application Directory VI отличается в новых версиях. Я свой пример тестил тоже на двух машинах (первая W7 64 бит, вторая WXP 32 бит) - на обеих ничего не создаётся, т. е. :vi: выдаёт < Not a path >.
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Запустить параллельно несколько экземпляров

Сообщение dadreamer »

А что возвращают Current VI's Path и свойство VI Path?
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Общие»