Страница 1 из 2
Запустить параллельно несколько экземпляров
Добавлено: 22 янв 2018, 22:32
Boris_K
Никак не могу запустить из верхнеуровневого
несколько экземпляров другого
(должны работать независимо, у каждого свой набор данных). У него есть входы для параметров запуска, а выходов нет, то есть каждый экземпляр нужно вызвать 1 раз и "забыть", а верхнеуровневый
продолжает выполняться параллельно. Пробовал запустить экземпляры в обычном цикле For, но просто выполняется первый, а остальные стоят, пока он не завершится, это естественно. Если же на блок-диаграмме явно размножить эти клоны (и все линии на их входы явно развести) - то всё работает как надо. Но это не вариант, клонов нужно довольно много.
По идее нужно через Start asynchronous call, так же в цикле, но не получается.
Re: Запустить параллельно несколько экземпляров
Добавлено: 23 янв 2018, 09:13
Artem.spb
Asynchronous Call and Forget.vi в стандартных примерах.
Возможно не корректные ключи запуска.
Кидайте ваш код, починим.
Re: Запустить параллельно несколько экземпляров
Добавлено: 23 янв 2018, 14:53
Boris_K
Если кратко, VI-клоны собирают информацию и пишут в файл, каждый клон пишет в свой файл.
Сделал Asynchronous Call как в примере. Вроде всё работает (экземпляры шлют нотификаторы со статистикой в верхнеуровневый
, судя по ним, всё пашет). Но файлов с результатами почему-то нет. При любых других способах вызова клонов - всё отлично, файлы есть. Код выложить проблематично, будет время - сделаю пример и выложу. Навскидку не подскажете, почему может быть так?
Нашёл другой способ - просто запуск в цикле For, у которого настроил параллелизм. Тут всё работает, файлы создаются, думаю так оставлю.
Re: Запустить параллельно несколько экземпляров
Добавлено: 23 янв 2018, 15:28
dadreamer
> Но файлов с результатами почему-то нет.
SubVI есс-но реентерантный? До кучи надо указать опцию 08 или 40, сходу не помню, какую. Ну, и имена файлов тоже должны отличаться - можно взять имя клона или рандом.
Re: Запустить параллельно несколько экземпляров
Добавлено: 23 янв 2018, 15:41
Boris_K
Да, реентерантный (preallocated clone). Имена файлов конечно отличаются. Опция изначально стояла 0x80 (согласно хелпу), пробовал добавить 0x40 и 0x08 - не помогло.
Re: Запустить параллельно несколько экземпляров
Добавлено: 23 янв 2018, 15:52
dadreamer
Выкладывайте упрощенный пример, посмотрим.
Re: Запустить параллельно несколько экземпляров
Добавлено: 23 янв 2018, 16:57
Boris_K
Вот простой пример на 2 экземпляра. Запустить _writer_test.vi.
Ещё не понятно, почему после выхода из головного
в памяти остаются работающими какие-то
Этого быть никак не должно, ведь они завершаются по сигналу нотификатора, и так и происходит при любом другом способе вызова.
Сейчас ещё поковыряю, посмотрю ошибки, почему файлы не пишутся.
Re: Запустить параллельно несколько экземпляров
Добавлено: 23 янв 2018, 18:27
dadreamer
Файлы пишутся, если открыть в блокноте, то это видно. Винда не всегда обновляет размер в проводнике. А по поводу "неостановки" клонов - нотифаеры надо уничтожать в основном
, а SubVI закрывать не только по статусу True, а ещё и по ошибке. Сейчас получается так, что когда Main остановлен,
уничтожает нотифаеры, а в клоне попытка чтения приводит к ошибке 1. Раз ошибка, то и статус False (дефолт), вот и не останавливается.
Re: Запустить параллельно несколько экземпляров
Добавлено: 23 янв 2018, 21:35
Boris_K
1) Это что вы в блокноте открывали?
У меня они вообще не создаются, сколько ни обновляй папку.
2) Насчёт нотифаеров в справке написано, что notifier refnum действует в пределах application instance, а не в пределах родительского
Нигде не написано, что родительский
при завершении удаляет созданные нотифаеры.
Re: Запустить параллельно несколько экземпляров
Добавлено: 23 янв 2018, 22:05
dadreamer
> У меня они вообще не создаются, сколько ни обновляй папку.
Хм, странно. А почему у вас такое необычное открытие файла? Есть же стандартный 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: Запустить параллельно несколько экземпляров
Добавлено: 23 янв 2018, 23:05
Boris_K
> А почему у вас такое необычное открытие файла? Есть же стандартный Open File.
По идее тут нет принципиальной разницы, как создавать. Мне показалось так чуть удобнее.
По нотификаторам получается в справке как-то мутно всё описано. Например там есть вот: "To destroy a notifier, ... or stop all VIs using the notifier reference". Вот я и думал, что пока есть работающие VI, которые используют нотификатор, он не удаляется. А получается не так.
З. Ы. Вы тестили наверное не в 2012 версии? Видимо, тут действительно какой-то баг.
Re: Запустить параллельно несколько экземпляров
Добавлено: 24 янв 2018, 00:11
Boris_K
Поковырял writer_unit. Оказывается, уже Application Directory VI выдаёт < Not a path >, вот файлы и не записываются. Согласно справке, такое было бы, если бы
не был сохранён на диске. Но он сохранён. И странно что у вас они пишутся. Другая версия
?
Re: Запустить параллельно несколько экземпляров
Добавлено: 24 янв 2018, 08:36
dadreamer
Файлы исправно пишутся, проверял на
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: Запустить параллельно несколько экземпляров
Добавлено: 24 янв 2018, 10:59
Boris_K
Получается что поведение Application Directory VI отличается в новых версиях. Я свой пример тестил тоже на двух машинах (первая W7 64 бит, вторая WXP 32 бит) - на обеих ничего не создаётся, т. е.
выдаёт < Not a path >.
Re: Запустить параллельно несколько экземпляров
Добавлено: 24 янв 2018, 11:32
dadreamer
А что возвращают Current VI's Path и свойство VI Path?