비동기적으로 VI 호출하기
- 업데이트 날짜:2025-08-27
- 4분 (읽기 시간)
SubVI나 참조에 의한 호출 노드로 타겟 VI에 대해 표준 호출을 수행하면, 타겟 VI가 결과를 반환할 때까지 해당 노드에서 데이터 흐름이 멈추고, 결과가 반환되면 노드의 출력 터미널로부터 데이터 흐름이 이어집니다.
반면, SubVI의 비동기화 호출은 호출 VI에서 데이터 흐름이 지속되는 상태에서 SubVI의 실행을 시작합니다. 호출 VI가 SubVI의 결과를 즉시 필요로 하지 않으면 SubVI를 비동기적으로 호출하는 것이 좋습니다. 그런 경우, 비동기화 호출 시 SubVI가 호출 VI와 병렬 실행되어 호출 VI의 실행 시간이 현저하게 개선될 수 있습니다. VI 비동기화 호출이 유익하게 쓰일만한 프로그래밍 예는 다음 리스트를 참조하십시오:
- 실행을 지속하면서 SubVI에 작업 할당하기
- 같은 타겟 VI의 여러 인스턴스에 단일 작업 배분하기, 특히 실행 시까지 작업에 필요한 인스턴스의 수를 알 수 없을 때
- 병렬 실행과 결과의 동시 수집이 필요한 개별 VI로 컨트롤되는 구성요소를 지닌 복잡한 사용자 인터페이스 시작하기
VI 비동기화 호출 생성의 개요
LabVIEW에서, 모든 VI 비동기화 호출은 다음 단계의 조합으로 이루어집니다.
- VI 참조가 비동기적으로 호출되도록 준비—참조를 [VI 참조 열기] 함수로 얻을 때 비동기화 실행을 대비해 VI 참조를 준비하고 비동기화 옵션 플래그 0x80 또는 0x100 중 하나를 옵션 입력의 일부로 포함시킵니다. 이 단계를 통해 LabVIEW는 비동기화 호출에 필요한 리소스를 할당합니다.
- VI 비동기화 호출 시작—VI 참조를 비동기화 호출 시작 노드에 연결하여 타겟 VI의 실행을 시작합니다. 타겟 VI가 실행되는 동안, 호출 VI에서 데이터 흐름이 지속됩니다.
- (옵션) VI 비동기화 호출의 결과 수집—비동기적으로 호출하는 타겟 VI의 출력이 어플리케이션에서 필요한 경우, VI 참조를 비동기화 호출 기다림 노드에 연결하여 결과를 수집합니다. 비동기화 호출 기다림 노드는 관련 subVI가 실행을 마칠 때까지 또는 비동기화 호출 기다림 노드가 타임아웃될 때까지 기다립니다.
- VI 참조 닫기—[참조 닫기] 함수를 사용하여 VI 참조의 사용이 끝났음을 LabVIEW에 알립니다. 그러면 LabVIEW가 관련 리소스를 해제할 수 있습니다.
VI 비동기화 호출의 타입
VI 비동기화 호출을 실행하려면, 다음 사용 모델 중 사용자 용도에 맞는 것이 무엇인지 결정해야 합니다. 각 모델의 실행에 대한 추가 정보는 다음 토픽을 참조하십시오:
- 호출 및 무시—호출 VI가 subVI의 실행을 시작하지만 subVI의 출력을 필요로 하지는 않습니다.
- 호출 및 수집—호출 VI가 subVI의 실행을 시작하며, 나중에 결과를 수집할 필요가 있습니다.
LabVIEW의 VI 비동기화 호출 관리 방법: 비동기화 호출 풀
비동기적으로 VI를 호출하는 대부분의 경우 LabVIEW가 어떻게 VI 비동기화 호출을 관리하는지 알아야 할 필요는 없지만, 비동기화 호출 풀을 이해하면 성능을 컨트롤하고 타이밍 결정성이 있는 어플리케이션을 디자인하는데 도움이 됩니다. 비동기화 옵션 플래그 하나를 [VI 참조 열기] 함수의 옵션 입력의 일부로 포함하여 VI 참조가 비동기적으로 실행될 수 있도록 준비하면, LabVIEW는 해당 VI의 개별 호출에 대한 데이터를 추적하는 데이터 공간 풀을 생성합니다. LabVIEW가 단일 데이터 공간이 아닌 데이터 공간 풀을 VI 참조에 연관시키기 때문에, 같은 VI 참조에서 여러 비동기화 호출을 시작할 수 있습니다. 비동기화 호출 시작 노드를 사용하여 VI 참조로 비동기화 호출을 시작할 때마다, LabVIEW는 데이터 공간 풀에서 공간 하나를 확보합니다. VI가 실행을 마치면, LabVIEW는 데이터 공간에 출력을 저장하고 VI 호출을 완료로 표시합니다. 비동기화 호출 기다림 노드가 호출된 VI의 출력을 기다리는 경우, LabVIEW는 데이터 공간으로부터 결과를 반환하고, 이로써 같은 VI에 호출을 더 할 수 있도록 데이터 공간이 비워집니다.
비동기화 호출 풀의 성능적 영향
각 VI 참조에 대해, LabVIEW는 타겟 컴퓨터의 각 CPU 코어에 있는 비동기화 호출 풀에서 하나의 데이터 공간을 생성합니다. 사용 가능한 데이터 공간보다 더 많은 동시 호출을 타겟 VI로 보내기 시작하면, LabVIEW는 데이터 공간을 더 할당해서 호출 풀의 크기를 증가시킵니다. 데이터 공간을 할당하는 프로세스가 정해진 시간 안에 끝나는 것이 아니기 때문에, 호출 VI는 비동기화 호출 시작 노드 어디에서나 할당을 유발하는 예상치 못한 지연을 겪을 수 있습니다.
비동기화 호출 시작 노드에서 예상치 못한 지연 방지하기
Real-Time OS에서 실행되어야 하는 VI의 예상치 못한 지연을 방지하려면, 비동기화 호출을 시작하기 전에 비동기화 호출 풀 채우기 메소드를 호출하여 주어진 VI 참조에 대해 호출 풀에서 데이터 공간의 수를 미리 할당합니다. 데이터 공간을 미리 할당하면 비동기화 호출 시작 노드에서 지연이 발생되지 않게 하고 지연을 프로그램의 시작으로 제한합니다.
비동기화 호출 풀이 성능에 미치는 영향에 대한 더 자세한 정보는 labview\examples\Application Control\VI Server\Asynchronous Call By Reference 디렉토리의 Populating the Asynchronous Call Pool VI를 참조하십시오. 관련 예제 찾기
같은 VI에 대한 여러 호출의 출력 수집에 미치는 비동기화 호출 풀의 영향
VI 비동기화 호출의 결과를 수집하려면, 호출된 VI의 참조를 비동기화 호출 기다림 노드로 전달해야 합니다. 비동기화 호출 기다림 노드는 특정한 데이터 공간의 참조가 아닌 VI의 참조를 받기 때문에, 노드는 참조된 VI에 대한 특정 호출의 출력을 수집할 수 없습니다. 그 대신 노드는 해당 VI에 대해 완료된 모든 호출의 출력을 반환합니다. 이 동작에 대한 더 자세한 설명은 다음 블록다이어그램을 참조하십시오.
라벨에서 보이는 것처럼, 여러 비동기화 호출 기다림 노드가 동일한 VI 참조에 의존할 때, 어떤 노드가 해당 VI 참조에 대한 특정 호출의 출력을 반환할지 예상할 수 없습니다. 앞의 다이어그램에서, 위쪽에 있는 비동기화 호출 기다림 노드는 비동기화 호출 시작 1에 연결되어 있지만 비동기화 호출 시작 2의 출력을 반환할 수 있습니다. 같은 VI에 대해 여러 호출을 실행하려 하지만 비동기화 호출 시작 노드를 특정한 비동기화 호출 기다림 노드와 짝을 지워야 하는 경우, 다음 두 솔루션 중 하나를 사용합니다.
- 실행하려는 모든 비동기화 호출에 대해 타겟 VI에 대한 고유한 VI 참조를 생성합니다. 비동기화 호출 기다림 노드와 비동기화 호출 시작 노드가 고유한 VI 참조를 공유하는 경우, 이 두 노드는 언제나 동일한 VI 인스턴스를 참조합니다. 이 솔루션은 고유한 VI 참조에 대한 여러 호출의 출력을 수집하는 것과 유사합니다.
- 타겟 VI가 고유한 숫자나 문자열을 입력으로 받아들이고 동일한 식별자를 출력으로 반환하도록 수정합니다. 타겟 VI를 비동기적으로 호출할 때, 특정한 비동기화 호출 시작 노드로 전달하는 식별자와 비동기화 호출 기다림 노드가 반환하는 식별자를 비교합니다. 그것이 일치하면, 비동기화 호출 기다림 노드가 반환한 호출을 알 수 있습니다.