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

Темы связанные с инженерными разработками, но не подходящие в другие ветки форума

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

Postby Boris_K on 22 Jan 2018, 22:32

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

По идее нужно через Start asynchronous call, так же в цикле, но не получается.
Race conditions - самый опасный, скользкий и противный баг!
Boris_K
developer
developer
 
Posts: 262
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby Artem.spb on 23 Jan 2018, 09:13

Asynchronous Call and Forget.vi в стандартных примерах.
Возможно не корректные ключи запуска.
Кидайте ваш код, починим.
Artem.spb
expert
expert
 
Posts: 1371
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 237
CLD hardware I/O VIP freelance

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

Postby Boris_K on 23 Jan 2018, 14:53

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

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

Нашёл другой способ - просто запуск в цикле For, у которого настроил параллелизм. Тут всё работает, файлы создаются, думаю так оставлю.
Race conditions - самый опасный, скользкий и противный баг!
Boris_K
developer
developer
 
Posts: 262
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby dadreamer on 23 Jan 2018, 15:28

> Но файлов с результатами почему-то нет.
SubVI есс-но реентерантный? До кучи надо указать опцию 08 или 40, сходу не помню, какую. Ну, и имена файлов тоже должны отличаться - можно взять имя клона или рандом.
User avatar
dadreamer
professor
professor
 
Posts: 3099
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 781
I/O VIP vision internet

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

Postby Boris_K on 23 Jan 2018, 15:41

Да, реентерантный (preallocated clone). Имена файлов конечно отличаются. Опция изначально стояла 0x80 (согласно хелпу), пробовал добавить 0x40 и 0x08 - не помогло.
Race conditions - самый опасный, скользкий и противный баг!
Boris_K
developer
developer
 
Posts: 262
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby dadreamer on 23 Jan 2018, 15:52

Выкладывайте упрощенный пример, посмотрим.
User avatar
dadreamer
professor
professor
 
Posts: 3099
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 781
I/O VIP vision internet

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

Postby Boris_K on 23 Jan 2018, 16:57

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

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

Сейчас ещё поковыряю, посмотрю ошибки, почему файлы не пишутся.
Attachments
async_call.zip
(25.7 KiB) Downloaded 47 times
Race conditions - самый опасный, скользкий и противный баг!
Boris_K
developer
developer
 
Posts: 262
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby dadreamer on 23 Jan 2018, 18:27

Файлы пишутся, если открыть в блокноте, то это видно. Винда не всегда обновляет размер в проводнике. А по поводу "неостановки" клонов - нотифаеры надо уничтожать в основном :vi: , а SubVI закрывать не только по статусу True, а ещё и по ошибке. Сейчас получается так, что когда Main остановлен, :labview: уничтожает нотифаеры, а в клоне попытка чтения приводит к ошибке 1. Раз ошибка, то и статус False (дефолт), вот и не останавливается.
User avatar
dadreamer
professor
professor
 
Posts: 3099
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 781
I/O VIP vision internet

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

Postby Boris_K on 23 Jan 2018, 21:35

1) Это что вы в блокноте открывали? :shok: У меня они вообще не создаются, сколько ни обновляй папку.
2) Насчёт нотифаеров в справке написано, что notifier refnum действует в пределах application instance, а не в пределах родительского :vi: Нигде не написано, что родительский :vi: при завершении удаляет созданные нотифаеры.
Race conditions - самый опасный, скользкий и противный баг!
Boris_K
developer
developer
 
Posts: 262
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby dadreamer on 23 Jan 2018, 22:05

> У меня они вообще не создаются, сколько ни обновляй папку.
Хм, странно. А почему у вас такое необычное открытие файла? Есть же стандартный 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. Если бы чистки не было, мы бы наблюдали в диспетчере задач постоянное увеличение объема занятой памяти. Но этого не происходит.
User avatar
dadreamer
professor
professor
 
Posts: 3099
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 781
I/O VIP vision internet

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

Postby Boris_K on 23 Jan 2018, 23:05

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

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

З. Ы. Вы тестили наверное не в 2012 версии? Видимо, тут действительно какой-то баг.
Race conditions - самый опасный, скользкий и противный баг!
Boris_K
developer
developer
 
Posts: 262
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby Boris_K on 24 Jan 2018, 00:11

Поковырял writer_unit. Оказывается, уже Application Directory VI выдаёт < Not a path >, вот файлы и не записываются. Согласно справке, такое было бы, если бы :vi: не был сохранён на диске. Но он сохранён. И странно что у вас они пишутся. Другая версия :labview: ?
Race conditions - самый опасный, скользкий и противный баг!
Boris_K
developer
developer
 
Posts: 262
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby dadreamer on 24 Jan 2018, 08:36

Файлы исправно пишутся, проверял на :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-кластер.
User avatar
dadreamer
professor
professor
 
Posts: 3099
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 781
I/O VIP vision internet

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

Postby Boris_K on 24 Jan 2018, 10:59

Получается что поведение Application Directory VI отличается в новых версиях. Я свой пример тестил тоже на двух машинах (первая W7 64 бит, вторая WXP 32 бит) - на обеих ничего не создаётся, т. е. :vi: выдаёт < Not a path >.
Race conditions - самый опасный, скользкий и противный баг!
Boris_K
developer
developer
 
Posts: 262
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby dadreamer on 24 Jan 2018, 11:32

А что возвращают Current VI's Path и свойство VI Path?
User avatar
dadreamer
professor
professor
 
Posts: 3099
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 781
I/O VIP vision internet

Next

Return to Общие

Who is online

Users browsing this forum: No registered users and 3 guests

cron