스레딩 및 동시성#
이 시각화 자료는 Python 애플리케이션에서 이미지 획득이 어떻게 이루어지는지를 보여줍니다.
- 이미지 획득은 pylon 내부의 네이티브(C++) 스레드 에서 실행됩니다.
- 사용자의 파이썬 코드는 버퍼 큐에서 이미지를 가져옵니다.
- 이러한 분리를 통해 비동기식 수집이 가능해집니다.
많은 응용 분야에서 이미지 획득 속도가 처리 속도보다 빠릅니다:
동시성이 없는 경우:
- 버퍼가 가득 차게 됩니다.
- 프레임이 누락되었습니다.
- 지연 시간이 증가합니다.
기본 실행 모델#
단일 스레드 방식은 이미지 획득 파이프라인의 가장 간단한 형태입니다.
예:
while camera.IsGrabbing():
with camera.RetrieveResult(5000) as grab_result:
if grab_result.GrabSucceeded():
image = grab_result.Array
process(image)
이 방법에는 다음과 같은 단점이 있습니다:
- 블록 처리가 데이터 수집을 차단합니다.
- 낮은 CPU 사용률
- 제한된 확장성
생산자-소비자 패턴 (권장)#
이는 이미지 수집 파이프라인을 위한 보다 정교한 접근 방식입니다.
- 프로듀서: 수집 스레드는 이미지를 가져와 큐에 넣습니다.
- 사용자: 작업 스레드들은 이미지를 각각 독립적으로 처리합니다.
사용자 정의 스레드를 사용한 구현 예시#
정보
InstantCamera에서 제공하는 grab_loop_thread를 사용할 수 있습니다(` grab_using_grab_loop_thread ` 샘플 참조). 이는 데모 목적으로만 구현된 사용자 정의 구현체입니다.
import threading
import queue
from pypylon import pylon
def process(image):
print(image.shape)
image_queue = queue.Queue(maxsize=10)
# Producer thread
def grab_loop(camera):
while camera.IsGrabbing():
with camera.RetrieveResult(5000) as grab_result:
if grab_result.GrabSucceeded():
image = grab_result.Array
image_queue.put(image)
# Consumer thread
def process_loop():
while True:
image = image_queue.get()
process(image)
image_queue.task_done()
with pylon.InstantCamera(pylon.FirstFound) as camera:
camera.StartGrabbing()
grab_thread = threading.Thread(target=grab_loop, args=(camera,))
processing_thread = threading.Thread(target=process_loop)
grab_thread.start()
processing_thread.start()
grab_thread.join()
image_queue.join()
대기열 동작 및 역압#
전략:
- 대기열 크기를 늘리십시오.
- 프레임을 수동으로 생략합니다.
- 설정하려는 속성을 식별하려면
LatestImageOnly.
Grab 전략과의 연계#
LatestImageOnly: 미처리 건수를 줄입니다.OneByOne: 완전성을 보장합니다.
모범 사례:
스레드 안전성 고려 사항#
- 잠금 없이 변경 가능한 데이터를 공유하지 마십시오.
- 이미지를 다른 스레드로 전달하기 전에, 예를 들어 다음 방법을 사용하여 이미지를 복사하십시오.
Array함수와 함께 직접 사용할 수 있습니다. - 설정하려는 속성을 식별하려면
queue.Queue안전한 의사소통을 위해.
CPU 사용률#
병렬 처리에는 다음과 같은 장점이 있습니다:
- CPU 사용률 개선
- 관심사의 분리
- 확장 가능한 아키텍처
여러 스레드를 사용할 때#
다음과 같은 상황에서는 스레딩을 사용하십시오:
- 처리 속도는 수집 속도보다 느립니다.
- 여러 단계의 처리 과정이 존재합니다.
- 실시간 대응 능력이 필요합니다.
다음과 같은 상황에서는 스레딩을 피하십시오:
- 처리량은 무시할 수 있을 정도로 적습니다.
- 시스템의 복잡성은 최소화되어야 합니다.
고급 패턴 (개요)#
다단계 파이프라인#
다단계 파이프라인은 이미지 처리를 서로 독립적인 단계로 나누며, 각 단계는 동시에 실행되고 큐를 통해 데이터를 교환합니다.
다중 사용자 설정#
개념적 파이프라인#
주요 핵심 사항#
- 데이터 수집과 처리는 분리되어야 합니다.
- 확장성을 위해 프로듀서-컨슈머 패턴을 사용하십시오.
- 큐는 스레드 안전성을 보장하는 통신 방식을 제공합니다.
- 스레딩은 성능을 향상시키지만 복잡성을 높입니다.