Запустить параллельно несколько экземпляров
Запустить параллельно несколько экземпляров
Никак не могу запустить из верхнеуровневого несколько экземпляров другого (должны работать независимо, у каждого свой набор данных). У него есть входы для параметров запуска, а выходов нет, то есть каждый экземпляр нужно вызвать 1 раз и "забыть", а верхнеуровневый продолжает выполняться параллельно. Пробовал запустить экземпляры в обычном цикле For, но просто выполняется первый, а остальные стоят, пока он не завершится, это естественно. Если же на блок-диаграмме явно размножить эти клоны (и все линии на их входы явно развести) - то всё работает как надо. Но это не вариант, клонов нужно довольно много.
По идее нужно через Start asynchronous call, так же в цикле, но не получается.
По идее нужно через Start asynchronous call, так же в цикле, но не получается.
Race conditions - опасный и скользкий баг!
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Запустить параллельно несколько экземпляров
Asynchronous Call and Forget.vi в стандартных примерах.
Возможно не корректные ключи запуска.
Кидайте ваш код, починим.
Возможно не корректные ключи запуска.
Кидайте ваш код, починим.
Re: Запустить параллельно несколько экземпляров
Если кратко, VI-клоны собирают информацию и пишут в файл, каждый клон пишет в свой файл.
Сделал Asynchronous Call как в примере. Вроде всё работает (экземпляры шлют нотификаторы со статистикой в верхнеуровневый , судя по ним, всё пашет). Но файлов с результатами почему-то нет. При любых других способах вызова клонов - всё отлично, файлы есть. Код выложить проблематично, будет время - сделаю пример и выложу. Навскидку не подскажете, почему может быть так?
Нашёл другой способ - просто запуск в цикле For, у которого настроил параллелизм. Тут всё работает, файлы создаются, думаю так оставлю.
Сделал Asynchronous Call как в примере. Вроде всё работает (экземпляры шлют нотификаторы со статистикой в верхнеуровневый , судя по ним, всё пашет). Но файлов с результатами почему-то нет. При любых других способах вызова клонов - всё отлично, файлы есть. Код выложить проблематично, будет время - сделаю пример и выложу. Навскидку не подскажете, почему может быть так?
Нашёл другой способ - просто запуск в цикле For, у которого настроил параллелизм. Тут всё работает, файлы создаются, думаю так оставлю.
Race conditions - опасный и скользкий баг!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Запустить параллельно несколько экземпляров
> Но файлов с результатами почему-то нет.
SubVI есс-но реентерантный? До кучи надо указать опцию 08 или 40, сходу не помню, какую. Ну, и имена файлов тоже должны отличаться - можно взять имя клона или рандом.
SubVI есс-но реентерантный? До кучи надо указать опцию 08 или 40, сходу не помню, какую. Ну, и имена файлов тоже должны отличаться - можно взять имя клона или рандом.
Re: Запустить параллельно несколько экземпляров
Да, реентерантный (preallocated clone). Имена файлов конечно отличаются. Опция изначально стояла 0x80 (согласно хелпу), пробовал добавить 0x40 и 0x08 - не помогло.
Race conditions - опасный и скользкий баг!
Re: Запустить параллельно несколько экземпляров
Вот простой пример на 2 экземпляра. Запустить _writer_test.vi.
Ещё не понятно, почему после выхода из головного в памяти остаются работающими какие-то Этого быть никак не должно, ведь они завершаются по сигналу нотификатора, и так и происходит при любом другом способе вызова.
Сейчас ещё поковыряю, посмотрю ошибки, почему файлы не пишутся.
Ещё не понятно, почему после выхода из головного в памяти остаются работающими какие-то Этого быть никак не должно, ведь они завершаются по сигналу нотификатора, и так и происходит при любом другом способе вызова.
Сейчас ещё поковыряю, посмотрю ошибки, почему файлы не пишутся.
- Вложения
-
- async_call.zip
- (25.7 КБ) 188 скачиваний
Race conditions - опасный и скользкий баг!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Запустить параллельно несколько экземпляров
Файлы пишутся, если открыть в блокноте, то это видно. Винда не всегда обновляет размер в проводнике. А по поводу "неостановки" клонов - нотифаеры надо уничтожать в основном , а SubVI закрывать не только по статусу True, а ещё и по ошибке. Сейчас получается так, что когда Main остановлен, уничтожает нотифаеры, а в клоне попытка чтения приводит к ошибке 1. Раз ошибка, то и статус False (дефолт), вот и не останавливается.
Re: Запустить параллельно несколько экземпляров
1) Это что вы в блокноте открывали? У меня они вообще не создаются, сколько ни обновляй папку.
2) Насчёт нотифаеров в справке написано, что notifier refnum действует в пределах application instance, а не в пределах родительского Нигде не написано, что родительский при завершении удаляет созданные нотифаеры.
2) Насчёт нотифаеров в справке написано, что notifier refnum действует в пределах application instance, а не в пределах родительского Нигде не написано, что родительский при завершении удаляет созданные нотифаеры.
Race conditions - опасный и скользкий баг!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Запустить параллельно несколько экземпляров
> У меня они вообще не создаются, сколько ни обновляй папку.
Хм, странно. А почему у вас такое необычное открытие файла? Есть же стандартный Open File.
> Насчёт нотифаеров что-то не то. Ведь при любом другом способе вызова (либо явно, либо в цикле For с параллелизмом) - всё работает как надо, вызванные subVI останавливаются (проверял, вышли ли они из цикла). Да и в справке написано, что notifier refnum действует в пределах application instance, а не в пределах родительского
И в текущем случае _иногда_ работает как надо, но не всегда. Вы можете сами это проверить, выведя error out из Get Notifier Status и отобразив панель SubVI при запуске. App Instance - это экземпляр в рамках проекта. Если не содержатся в проекте, они помещаются в отдельный App Instance. Я думаю, здесь как-то так: в Main нет закрытия нотифаеров, а SubVI запускаются с флагом "забыть". После отработки Main выполняет очистку памяти, удаляя нотифаеры (про клоны он "забыл"). Поэтому ссылки становятся недействительны (ошибка 1).
И таки да, чистка всегда выполняется по окончании работы . Это логично, и кроме того легко проверяется. Поместите на БД Obtain Notifier и нажмите Run Continuously. Если бы чистки не было, мы бы наблюдали в диспетчере задач постоянное увеличение объема занятой памяти. Но этого не происходит.
Хм, странно. А почему у вас такое необычное открытие файла? Есть же стандартный Open File.
> Насчёт нотифаеров что-то не то. Ведь при любом другом способе вызова (либо явно, либо в цикле For с параллелизмом) - всё работает как надо, вызванные subVI останавливаются (проверял, вышли ли они из цикла). Да и в справке написано, что notifier refnum действует в пределах application instance, а не в пределах родительского
И в текущем случае _иногда_ работает как надо, но не всегда. Вы можете сами это проверить, выведя error out из Get Notifier Status и отобразив панель SubVI при запуске. App Instance - это экземпляр в рамках проекта. Если не содержатся в проекте, они помещаются в отдельный App Instance. Я думаю, здесь как-то так: в Main нет закрытия нотифаеров, а SubVI запускаются с флагом "забыть". После отработки Main выполняет очистку памяти, удаляя нотифаеры (про клоны он "забыл"). Поэтому ссылки становятся недействительны (ошибка 1).
И таки да, чистка всегда выполняется по окончании работы . Это логично, и кроме того легко проверяется. Поместите на БД Obtain Notifier и нажмите Run Continuously. Если бы чистки не было, мы бы наблюдали в диспетчере задач постоянное увеличение объема занятой памяти. Но этого не происходит.
Re: Запустить параллельно несколько экземпляров
> А почему у вас такое необычное открытие файла? Есть же стандартный Open File.
По идее тут нет принципиальной разницы, как создавать. Мне показалось так чуть удобнее.
По нотификаторам получается в справке как-то мутно всё описано. Например там есть вот: "To destroy a notifier, ... or stop all VIs using the notifier reference". Вот я и думал, что пока есть работающие VI, которые используют нотификатор, он не удаляется. А получается не так.
З. Ы. Вы тестили наверное не в 2012 версии? Видимо, тут действительно какой-то баг.
По идее тут нет принципиальной разницы, как создавать. Мне показалось так чуть удобнее.
По нотификаторам получается в справке как-то мутно всё описано. Например там есть вот: "To destroy a notifier, ... or stop all VIs using the notifier reference". Вот я и думал, что пока есть работающие VI, которые используют нотификатор, он не удаляется. А получается не так.
З. Ы. Вы тестили наверное не в 2012 версии? Видимо, тут действительно какой-то баг.
Race conditions - опасный и скользкий баг!
Re: Запустить параллельно несколько экземпляров
Поковырял writer_unit. Оказывается, уже Application Directory VI выдаёт < Not a path >, вот файлы и не записываются. Согласно справке, такое было бы, если бы не был сохранён на диске. Но он сохранён. И странно что у вас они пишутся. Другая версия ?
Race conditions - опасный и скользкий баг!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Запустить параллельно несколько экземпляров
Файлы исправно пишутся, проверял на 2016-2017 (64 бита) на двух машинах с W7-W10. С нотифаерами тоже вроде всё понятно, сам давно их использую, нареканий нет. Единственное, что мне не совсем понятно, почему в справке не написано, что при использовании 0x80 (call and forget) клон становится вне области App instance (даже при добавлении всех ВИ-аек в проект). Может, где-то есть статейка, сходу не нашёл. Вот здесь была аналогичная ситуация: https://forums.ni.com/t5/LabVIEW/Close- ... 21#M990609 Предлагаю не париться, а просто сделать, как я всегда делаю - статус Stop-уведомителя проверяется через ИЛИ - True ИЛИ Ошибка. Если ссылка недействительна (Main остановлен), дальше работать не имеет смысла и программа (т.е., все саб-ВИ) должна остановиться. Если уведомитель не для стопа, а какой-то другой - обрабатывать error-кластер.
Re: Запустить параллельно несколько экземпляров
Получается что поведение Application Directory VI отличается в новых версиях. Я свой пример тестил тоже на двух машинах (первая W7 64 бит, вторая WXP 32 бит) - на обеих ничего не создаётся, т. е. выдаёт < Not a path >.
Race conditions - опасный и скользкий баг!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Запустить параллельно несколько экземпляров
А что возвращают Current VI's Path и свойство VI Path?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 2 Ответы
- 551 Просмотры
-
Последнее сообщение Юрий