스레딩 및 동시성#
이 시각화 자료는 Python 애플리케이션에서 이미지 획득이 작동하는 방식을 보여줍니다.
- 이미지 획득은 pylon 내의 네이티브(C++) 스레드에서 실행됩니다.
- 사용자의 Python 코드는 버퍼 큐에서 이미지를 검색합니다.
- 이러한 분리를 통해 비동기 획득이 가능해집니다.
많은 애플리케이션에서 이미지 획득이 처리보다 더 빠릅니다.
동시성이 없는 경우:
- 버퍼가 Fill 됩니다.
- 프레임이 드롭됩니다.
- 대기 시간이 증가합니다.
Basic Execution Model#
단일 스레드 방식은 이미지 획득 파이프라인의 가장 단순한 형태입니다.
예:
while camera.IsGrabbing():
with camera.RetrieveResult(5000) as grab_result:
if grab_result.GrabSucceeded():
image = grab_result.Array
process(image)
이 방식에는 다음과 같은 단점이 있습니다.
- 처리가 획득을 차단합니다.
- 저조한 CPU Utilization
- 제한된 확장성
Producer–Consumer Pattern (Recommended)#
이미지 취득 파이프라인을 위한 보다 정교한 접근 방식입니다.
- Producer: 취득 스레드가 이미지를 캡처하여 큐에 넣습니다.
- Consumer: 작업자 스레드가 이미지를 독립적으로 처리합니다.
커스텀 스레드를 사용하는 예제 구현#
정보
InstantCamera에서 제공하는 그랩 루프 스레드를 사용할 수 있습니다(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.
Combining with Grab Strategies#
LatestImageOnly: 대기열을 줄입니다.OneByOne: 완전성을 보장합니다.
모범 사례:
Thread-Safety Considerations#
- 락 없이 가변 데이터를 공유하지 마세요.
- 예를 들어 다음을 사용하여 다른 스레드에 전달하기 전에 이미지를 복사합니다.
Array함수입니다. - 사용
queue.Queue(안전한 통신을 위해).
CPU Utilization#
병렬 처리는 다음과 같은 이점을 제공합니다.
- 향상된 CPU 사용률
- 관심사 분리
- 확장 가능한 아키텍처
When to Use Multiple Threads#
다음과 같은 상황에서는 스레딩을 사용하세요.
- 처리가 취득보다 느립니다.
- 여러 처리 단계가 존재합니다.
- 실시간 응답성이 필요합니다.
다음과 같은 상황에서는 스레딩을 피하세요.
- 처리가 미미한 수준입니다.
- 시스템 복잡성이 최소화되어야 합니다.
Advanced Patterns (Overview)#
Multi-Stage Pipeline#
다단 파이프라인은 이미지 처리를 독립된 단계로 나누어 동시에 실행하고 큐를 통해 데이터를 교환합니다.
Multi-Consumer Setup#
Conceptual Pipeline#
주요 내용 요약#
- 취득과 처리는 분리되어야 합니다.
- 확장성을 위해 생산자-소비자 패턴을 사용하십시오.
- 큐는 스레드 안전한 통신을 제공합니다.
- 스레딩은 성능을 향상시키지만 복잡성을 증가시킵니다.