Skip to main content

ALASKA - Multiprocess Task Management Framework for Python

Project description

ALASKA v2.6

Advanced Lightweight Asynchronous Service Kernel for Applications

PyPI version Python License

Python 멀티프로세스 태스크 관리 프레임워크. RMI(Remote Method Invocation), 공유 메모리 IPC(SmRingBuffer, SmBlock), Signal(QoS), DeviceProperty 기반의 산업용 제어 시스템 구축을 지원합니다.

Features

  • @task 데코레이터: 클래스 하나로 process/thread 태스크 정의
  • RMI: SmRingBuffer + 바이너리 프로토콜 기반 프로세스 간 메서드/프로퍼티 호출
  • SmRingBuffer: Lock-free SPSC 링 버퍼 — RMI/Signal IPC 고속 전송 (avg 0.028ms)
  • SmBlock: 공유 메모리 기반 Zero-copy 데이터 전송 (numpy 배열)
  • Signal: QoS 기반 계층적 Pub/Sub 메시징 (signal.camera.connected.emit())
  • SmSignalRegistry: 공유 메모리 비트맵 기반 구독자 레지스트리
  • SmMutex / SmKernelEvent: Win32 Named Mutex 및 커널 이벤트 동기화
  • DeviceProperty: 선언형 HW 속성 관리 (캐시, opstate, resync, debounce)
  • Qt 통합: AlaskaApp.run()으로 PySide6 UI 태스크 지원
  • Web 모니터링: HTTP 기반 실시간 대시보드 (태스크 상태, RMI 통계, CPU/메모리)
  • Auto-restart: 태스크 장애 시 자동 복구
  • JSON 설정: @import 기반 태스크 클래스 자동 탐지 및 속성 주입

Installation

pip install py-alaska

Quick Start

1. 태스크 정의

from py_alaska import task

@task(mode="process", restart=True)
class MyWorker:
    def __init__(self):
        self.counter = 0

    def increment(self, value: int) -> int:
        self.counter += value
        return self.counter

    def run(self):
        while self.running:
            pass

2. 설정 파일 (config.json)

{
  "app_info": {
    "name": "MyApp",
    "id": "myapp_001",
    "version": "1.0.0"
  },
  "task_config": {
    "worker/MyWorker": {
      "@import": "my_tasks"
    }
  }
}

3. 실행

from py_alaska import TaskManager, gconfig

gconfig.load("config.json")
manager = TaskManager(gconfig)
manager.start_all()

client = manager.get_client("worker")
result = client.increment(10)   # RMI: 프로세스 간 호출
print(f"Counter: {result}")     # → Counter: 10

Architecture

┌──────────────────────────────────────────────────────────────────┐
│                          TaskManager                             │
├──────────────────────────────────────────────────────────────────┤
│  ┌────────────┐    ┌────────────┐    ┌────────────┐              │
│  │  Task A    │    │  Task B    │    │  Task C    │              │
│  │ (Process)  │    │ (Process)  │    │ (Thread)   │              │
│  │ RmiClient  │    │ DEVICE_    │    │  QWidget   │              │
│  │            │    │ PROPERTY   │    │DirectClient│              │
│  └─────┬──────┘    └─────┬──────┘    └─────┬──────┘              │
│        │                 │                 │                     │
│        └─────────────────┼─────────────────┘                     │
│                          │                                       │
│            ┌─────────────┴──────────────┐                        │
│            │  InvokeDispenser           │                        │
│            │  (Signal + RMI 통합 디스패처) │                        │
│            └─────────────┬──────────────┘                        │
│                          │                                       │
│     ┌────────────────────┼────────────────────┐                  │
│     │                    │                    │                  │
│  ┌──┴──────────┐  ┌──────┴──────┐  ┌─────────┴──┐               │
│  │SmRingBuffer │  │SignalBroker │  │  SmBlock   │               │
│  │(Lock-free   │  │(QoS, Sub-  │  │ (Zero-copy │               │
│  │ SPSC IPC)   │  │ scriberCache│  │  numpy)    │               │
│  │+RmiProtocol │  │+SmSignal   │  │            │               │
│  │ (Binary)    │  │  Registry  │  │            │               │
│  └─────────────┘  └────────────┘  └────────────┘               │
│                                                                  │
│  ┌────────────┐  ┌────────────┐  ┌────────────┐                 │
│  │ SmMutex    │  │SmKernel   │  │  GConfig   │                 │
│  │(Win32 Named│  │  Event    │  │(JSON/YAML) │                 │
│  │ Mutex)     │  │(동기화)    │  │            │                 │
│  └────────────┘  └────────────┘  └────────────┘                 │
├──────────────────────────────────────────────────────────────────┤
│  TaskMonitor (HTTP :7000)  │  TaskProfiler  │  SmBlackBox       │
└──────────────────────────────────────────────────────────────────┘

Performance (v2.6)

항목 설명 avg p50
PM-01 RMI round-trip 0.028ms 0.025ms
PM-02 Signal P→T 0.078ms 0.077ms
PM-04 Nowait TPS 29,384
PM-09 Signal Ping-pong 0.152ms 0.149ms
PM-10 3-Hop RMI 0.153ms 0.122ms
PM-12 Pure Signal Ping 0.194ms 0.192ms
PM-07 Registry Lookup 4.3us 4.4us

Core API

@task 데코레이터

@task(
    name="task_name",      # 태스크 식별자 (생략 시 클래스명 사용)
    mode="process",        # "process" | "thread"
    restart=True,          # 장애 시 자동 재시작
)
class MyTask:
    def run(self):         # 메인 실행 루프
        while self.running:
            pass
  • 모든 public 메서드가 RMI 대상이 됨
  • self.running: 실행 상태 플래그
  • self.runtime: 프레임워크 런타임 (signal, log 등)
  • self.signal: Signal 클라이언트

RMI (Remote Method Invocation)

SmRingBuffer + 바이너리 프로토콜(RmiProtocol) 기반 프로세스 간 투명 호출. Thread 모드에서는 DirectClient 로 직접 호출하여 IPC 오버헤드 없이 동작합니다.

# 태스크 내부에서 다른 태스크 호출
client = self.runtime.get_client("other_task")
result = client.some_method(arg1, arg2)

# 프로퍼티도 RMI로 투명하게 접근
client.exposure = 15000       # setter 호출
value = client.exposure       # getter 호출

# 비동기 호출 (nowait)
client.some_method.nowait(arg1, arg2)

Signal

SmSignalRegistry(공유 메모리 비트맵) 기반 구독자 관리. QoS 우선순위 지원 (CRITICAL → LOW).

# 발행
self.signal.camera.connected.emit({"source": "cam1", "fps": 30})

# QoS 지정 발행
self.signal.sensor.temp.emit(value, qos="CRITICAL")

# 수신 (on_시그널경로 메서드 자동 바인딩)
def on_camera_connected(self, signal):
    print(signal.data["fps"])

SmBlock (공유 메모리)

{
  "platform_config": {
    "_smblock": {
      "image_pool": {"shape": [1024, 1024, 3], "maxsize": 100}
    }
  }
}
index = self.smblock.alloc()            # 블록 할당
buffer = self.smblock.get_buffer(index)  # numpy 배열 참조
buffer[:] = frame_data                   # Zero-copy 쓰기
self.smblock.mfree(index)               # 블록 해제

DeviceProperty

HW 속성을 선언형으로 관리합니다. 캐시, 타입 변환, opstate 조건부 HW 쓰기, resync 일괄 적용을 자동 처리합니다.

@task(mode="process", restart=True)
class CameraDriver:
    DEVICE_PROPERTY = {
        "is_connect:bool=false": {},
        "exposure:int=15000": {
            "setter": "_hw_set_exposure",
            "debounce": 0.5,
        },
        "trigger_mode:bool=false": {
            "setter": "_hw_set_trigger",
        },
        "@resync": {
            "open": "_session_open",
            "close": "_session_close",
            "condition": {"Eq": ["is_connect", True]},
            "order": ["trigger_mode", "exposure"]
        }
    }

    def _hw_set_exposure(self, value):
        ...  # HW에 값 적용

    def _session_open(self):
        ...  # resync 전 HW 잠금

    def _session_close(self):
        ...  # resync 후 HW 해제

동작 흐름:

비연결 상태:  cam.exposure = 1000  → 캐시 저장, Signal 발행, HW 미적용 (opstate 미충족)
연결 시:      cam.is_connect = True → @resync 트리거
              → _session_open()
              → trigger_mode HW 적용
              → exposure HW 적용
              → _session_close()

키 포맷: "name:dtype=default" (예: "exposure:int=15000")

옵션 설명
setter HW 쓰기 콜백 (self, value)
getter HW 읽기 콜백 (self) → value
validator 값 검증 콜백 (self, value) → value
debounce HW 쓰기 지연 (초). 캐시/Signal은 즉시, HW는 타이머 리셋 후 적용
notify_mode "immediate" (기본) 또는 "on_write"
@resync {open, close, condition, order} — 조건 충족 시 일괄 적용

Config (JSON)

{
  "app_info": {"name": "MyApp", "id": "node-001", "version": "1.0.0"},
  "platform_config": {
    "_smblock": {"pool": {"shape": [1024, 1024, 3], "maxsize": 100}},
    "_monitor": {"port": 7000, "exit_hook": true}
  },
  "task_config": {
    "group/task_name": {
      "@import": "module.path",
      "property1": "value1"
    }
  }
}
  • @import: 태스크 클래스가 위치한 모듈 경로
  • group/task_name: group은 논리 그룹, task_name@task(name=...) 이름
  • 나머지 키-값: 태스크 인스턴스 속성으로 자동 주입
  • client:task_id: RMI 프록시 자동 주입 (self.target = client:camera1)
  • smblock:pool_name: SmBlock 인스턴스 자동 주입

Examples

예제 설명
ex010_hello_world 최소 태스크 정의 및 실행
ex020_debug 디버그 모드
ex030_profiler 태스크 프로파일러
ex040_restart 장애 시 자동 재시작
ex050_select_signal Signal 선택적 구독 (Producer-Worker)
ex060_dynamic_signal 동적 Signal 생성
ex070_chain_call RMI 체인 호출
ex080_persistent 영구 설정 관리 (GConfig)
ex090_signal_rmi_combo Signal + RMI 혼합 패턴
ex091_property_rmi 프로퍼티 RMI 접근 (Process/Thread)
ex100_direct_update_ui Qt UI 직접 업데이트
ex110_smblock SmBlock 공유 메모리 IPC
ex120_task 태스크 고급 패턴
ex130_camera IMI 카메라 뷰어 (CamProperty)
ex130a_camera IMI 카메라 뷰어 (DeviceProperty)
ex140_performance 성능 측정
ex150_dynamic_task 동적 태스크 생성/제거
ex160_device_property DeviceProperty 데모
ex170_web_debugger 웹 디버거
ex180_JoyStick 조이스틱 제어
ex510_save_image 이미지 저장

Monitoring

http://localhost:7000 (설정 포트)에서 웹 대시보드에 접근합니다.

  • 태스크 상태 (alive/stopped)
  • RMI 호출 통계 (횟수, 응답시간)
  • CPU/메모리 사용량
  • SmBlock 풀 사용률
  • 설정 편집기

Module Structure

py_alaska/
├── core/                          # 핵심 태스크 실행 프레임워크 (Public 9 + Internal 8)
│   ├── task_manager.py            # TaskManager, TaskInfo, ShmResourceFactory
│   ├── task_signal.py             # SignalBroker, SignalClient, SubscriberCache
│   ├── task_decorator.py          # @task, @rmi_task 데코레이터
│   ├── gconfig.py                 # GConfig 전역 설정 관리
│   ├── task_error.py              # 예외 클래스
│   ├── task_performance.py        # 성능 메트릭 수집
│   ├── task_profiler.py           # 코드 블록 프로파일링
│   ├── task_log.py                # 중앙 로깅 시스템
│   ├── _log_handler.py            # 멀티프로세스 안전 파일 로깅
│   ├── _banner.py                 # 배너 출력
│   ├── _rmi_client.py             # RmiProtocol, RmiClient, DirectClient
│   ├── _signal_core.py            # QoS, Signal, PriorityScheduler
│   ├── _task_runtime.py           # TaskRuntime, InvokeDispenser
│   ├── _task_validator.py         # TaskValidator (태스크 검증)
│   ├── _config_infra.py           # GConfig 예외 11종 + 인프라 (FileLock, PathParser)
│   └── _comm_utils.py             # 통신 유틸리티 (디버그, 체인, 비동기)
├── sm_infra/                      # 공유 메모리 인프라
│   ├── _base.py                   # _ShmBase (공유 메모리 기반 클래스)
│   ├── sm_ring_buffer.py          # SmRingBuffer (Lock-free SPSC)
│   ├── sm_block.py                # SmBlock, SmBlockBuffer, SmBlockHandler
│   ├── sm_value.py                # SmValue (고속 스칼라 값)
│   ├── sm_queue.py                # SmQueue (SharedMemory IPC Queue)
│   ├── sm_signal.py               # SmSignalRegistry, SmSignalStats
│   ├── sm_blackbox.py             # SmBlackBox (시그널 체인 감시)
│   └── sm_sync.py                 # SmKernelEvent, SmLockFreeEvent, SmMutex
├── device/                        # 디바이스 속성 관리
│   ├── device_property.py         # DeviceProperty
│   ├── device_schema.py           # DeviceSchema (키 파싱)
│   └── device_infra.py            # DeviceInfra (타이머, 콜백)
├── qt/                            # Qt 통합 (PySide6)
│   ├── app.py                     # AlaskaApp
│   ├── decorators.py              # Qt 데코레이터
│   ├── tab_camera.py              # TabCamera (카메라 UI)
│   └── _zoom_view.py              # ZoomView, CameraView
└── monitor/                       # Web 모니터링 대시보드
    ├── task_monitor.py            # TaskMonitor (HTTP 서버)
    ├── task_monitor_sysinfo.py    # HwInfoCollector
    ├── task_monitor_ext_link.py   # Slack/Email/Webhook 연동
    ├── task_monitor_html.py       # 대시보드 HTML
    ├── task_monitor_debug_html.py # 디버그 HTML
    └── task_monitor_css.py        # 스타일시트

Requirements

  • Python >= 3.10
  • numpy
  • opencv-python (optional)
  • PySide6 (optional, Qt UI)

License

Copyright (c) 동일비전(Dongil Vision Korea). All Rights Reserved. 무단 복제 및 배포를 금지합니다. 연구 목적의 개인 사용은 허용됩니다.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py_alaska-0.1.29.tar.gz (1.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

py_alaska-0.1.29-py3-none-any.whl (1.1 MB view details)

Uploaded Python 3

File details

Details for the file py_alaska-0.1.29.tar.gz.

File metadata

  • Download URL: py_alaska-0.1.29.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for py_alaska-0.1.29.tar.gz
Algorithm Hash digest
SHA256 6a882f2324a4bf49ad59e655afef53cbc4281b29a12504523a10237c41af5914
MD5 34613264461b363298e3e220121e5b1b
BLAKE2b-256 7a32480481e044ff790c8c3937af3da523b786b044374942e039b08d34e69d75

See more details on using hashes here.

File details

Details for the file py_alaska-0.1.29-py3-none-any.whl.

File metadata

  • Download URL: py_alaska-0.1.29-py3-none-any.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for py_alaska-0.1.29-py3-none-any.whl
Algorithm Hash digest
SHA256 24d40c708bdc0ce4fb6aa64e8cba1f1d45cafdc74b35515b976c098b5ecf254e
MD5 7484fe4c57430d1675303b0b4fda6609
BLAKE2b-256 b3551e8a1a182585c5f4ac3bc0475cf950fc6398383e6a71121abb4f9acdf600

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page