ALASKA - Multiprocess Task Management Framework for Python
Project description
ALASKA v2.7
Advanced Lightweight Asynchronous Service Kernel for Applications
Python 멀티프로세스 태스크 관리 프레임워크. RMI(Remote Method Invocation), 공유 메모리 IPC(SmRingBuffer, SmBlock), TSignal(QoS), DeviceProperty 기반의 산업용 제어 시스템 구축을 지원합니다.
Features
@task데코레이터: 클래스 하나로 process/thread 태스크 정의- RMI: SmRingBuffer + 바이너리 프로토콜 기반 프로세스 간 메서드/프로퍼티 호출 (avg 0.039ms)
- TSignal: 선언형 Signal 변수 —
@on(Camera.frame_raw)타입 안전 구독 (v2.7) - SmRingBuffer: Lock-free SPSC 링 버퍼 — struct+memoryview 기반 무할당 IPC
- SmBlock: 공유 메모리 기반 Zero-copy 이미지 전송 (numpy 배열)
- SignalBroker: QoS 우선순위 Pub/Sub — CRITICAL(P1) ~ BACKGROUND(P5)
- SmSignalRegistry: 공유 메모리 비트맵 기반 구독자 레지스트리 (조회 avg 2.6μs)
- SmMutex / SmKernelEvent: Win32 Named Mutex 및 커널 이벤트 동기화
- DeviceProperty: 선언형 HW 속성 관리 (캐시, opstate, resync, debounce, rollback)
- Qt 통합:
AlaskaApp.run()으로 PySide6 UI 태스크 지원 - Web 모니터링: HTTP 기반 실시간 대시보드 (태스크 상태, RMI 통계, CPU/메모리)
- Auto-restart: 태스크 장애 시 자동 복구
- JSON 설정:
@import기반 태스크 클래스 자동 탐지 및 속성 주입
History
| 버전 | 시기 | 주요 내용 |
|---|---|---|
| v1.x | 2024 | 최초 개발 — multiprocessing 기반 Task 관리, RMI, Signal Pub/Sub |
| v2.0 | 2026-01 | 전면 재설계 — SmRingBuffer(Lock-free SPSC), SmBlock(Zero-copy), SmSignalRegistry(공유 메모리 비트맵) |
| v2.3 | 2026-02 | DeviceProperty, SmBlackBox, QoS 우선순위 스케줄러 |
| v2.6 | 2026-03 | SmInfra 최적화(M-01~M-10) — struct+memoryview, DirectClient, binary RMI protocol |
| v2.7 | 2026-03 | TSignal 선언형 Signal 변수, @on() 데코레이터 — @rmi_signal / signal_subscribe 제거 |
Installation
pip install py-alaska
Quick Start
1. 태스크 정의
from py_alaska import task
from py_alaska.core.task_signal_decl import TSignal, on
@task(mode="process", restart=True)
class Sensor:
temperature = TSignal(float, name="sensor.temp") # 선언형 Signal
def run(self):
while self.running:
self.temperature.emit(self._read()) # emit
def _read(self):
return 25.0
@task(mode="thread")
class Monitor:
@on(Sensor.temperature) # 타입 안전 구독
def on_temp(self, signal):
print(f"Temp: {signal.data}°C")
2. 설정 파일 (config.json)
{
"app_info": {"name": "MyApp", "id": "myapp_001", "version": "1.0.0"},
"task_config": {
"sensor/Sensor": {"@import": "my_tasks"},
"monitor/Monitor": {"@import": "my_tasks"}
}
}
3. 실행
from py_alaska import TaskManager, gconfig
gconfig.load("config.json")
manager = TaskManager(gconfig)
manager.start_all()
client = manager.get_client("sensor")
print(client._read()) # RMI: 프로세스 간 메서드 호출
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 P1~P5 │ │ (Zero-copy │ │
│ │ SPSC IPC) │ │+TSignal │ │ numpy) │ │
│ │+RmiProtocol │ │+SmSignal │ │ │ │
│ │ (Binary) │ │ Registry │ │ │ │
│ └─────────────┘ └────────────┘ └────────────┘ │
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ SmMutex │ │SmKernel │ │ GConfig │ │
│ │(Win32 Named│ │ Event │ │(JSON/YAML) │ │
│ │ Mutex) │ │(동기화) │ │ │ │
│ └────────────┘ └────────────┘ └────────────┘ │
├──────────────────────────────────────────────────────────────────┤
│ TaskMonitor (HTTP :7000) │ TaskProfiler │ SmBlackBox │
└──────────────────────────────────────────────────────────────────┘
Performance (v2.7, 2026-04-25)
| 항목 | 설명 | avg | p50 | p99 |
|---|---|---|---|---|
| PM-01 | RMI round-trip | 0.039ms | 0.036ms | 0.091ms |
| PM-02 | Signal P→T | 0.072ms | 0.068ms | 0.165ms |
| PM-04 | Nowait RMI TPS | 23,738 | — | — |
| PM-05 | Multi-task TPS | 23,348 | — | — |
| PM-07 | Registry Lookup | 2.6μs | 2.5μs | 4.2μs |
| PM-09 | Signal Ping-pong | 0.101ms | 0.098ms | 0.159ms |
| PM-10 | 3-Hop RMI | 0.181ms | 0.176ms | 0.269ms |
| PM-11 | 3-Hop Signal | 0.204ms | 0.188ms | 0.309ms |
| PM-12 | Pure Signal Ping | 0.174ms | 0.175ms | 0.316ms |
Core API
@task 데코레이터
@task(
name="task_name", # 태스크 식별자 (생략 시 클래스명 사용)
mode="process", # "process" | "thread"
restart=True, # 장애 시 자동 재시작
restart_delay=1.0, # 재시작 대기 시간 (초)
)
class MyTask:
def run(self): # 메인 실행 루프
while self.running:
pass
- 모든 public 메서드가 RMI 대상
self.running: 실행 상태 플래그self.signal: Signal 클라이언트self.task_name: 등록된 태스크 ID
TSignal (v2.7)
선언형 Signal 변수. 클래스 변수로 선언하면 emit 목록이 명시적으로 드러나고, @on()으로 타입 안전 구독이 가능합니다.
from py_alaska.core.task_signal_decl import TSignal, on
@task()
class Camera:
frame_raw = TSignal(dict, name="camera.frame_raw") # 선언
connected = TSignal(bool, name="camera.connected")
def run(self):
while self.running:
frame = self.capture()
self.frame_raw.emit({"index": frame_idx}) # emit
@task()
class Viewer:
@on(Camera.frame_raw) # 타입 안전 구독
def on_frame(self, signal):
idx = signal.data["index"]
@on(Camera.connected)
@ui_thread # Qt UI 스레드 전환
def on_connected(self, signal):
self.btn.setEnabled(signal.data)
RMI (Remote Method Invocation)
SmRingBuffer + 바이너리 프로토콜 기반 프로세스 간 투명 호출. Thread 모드에서는 DirectClient로 IPC 없이 직접 호출합니다.
# 동기 호출 (반환값 있음)
result = self.worker.process(data)
# 비동기 호출 (fire-and-forget)
self.worker.process.nowait(data)
# 프로퍼티 RMI
self.camera.exposure = 15000 # setter
value = self.camera.exposure # getter
SmBlock (Zero-copy 이미지 전송)
{
"platform_config": {
"_smblock": {
"image_pool": {"shape": [1024, 1024, 3], "maxsize": 100}
}
}
}
index = self.smblock.alloc() # 블록 할당
buf = self.smblock.get_buffer(index) # numpy 배열 참조 (Zero-copy)
buf[:] = frame_data # 직접 쓰기
self.smblock.mfree(index) # 해제
DeviceProperty
HW 속성을 선언형으로 관리합니다. 캐시, 타입 변환, opstate, resync, debounce, HW 실패 시 cache rollback을 자동 처리합니다.
from py_alaska.device.device_property import DeviceProperty
@task(mode="process")
class CameraDriver:
exposure = DeviceProperty(
dtype=int, default=15000,
setter="_hw_set_exposure",
debounce=0.5,
)
trigger_mode = DeviceProperty(
dtype=bool, default=False,
setter="_hw_set_trigger",
)
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",
"client_ref": "client:other_task"
}
}
}
@import: 태스크 클래스가 위치한 모듈 경로group/task_name:group은 논리 그룹,task_name은@task(name=...)이름client:task_id: RMI 프록시 자동 주입smblock:pool_name: SmBlock 인스턴스 자동 주입
Examples
| 예제 | 설명 |
|---|---|
ex010_hello_world |
최소 태스크 정의 및 실행 |
ex020_debug |
디버그 모드 |
ex030_profiler |
태스크 프로파일러 |
ex040_restart |
장애 시 자동 재시작 |
ex050_select_signal |
Signal 선택적 구독 |
ex060_dynamic_signal |
동적 Signal 구독 |
ex070_chain_call |
RMI 체인 호출 |
ex080_persistent |
영구 설정 (GConfig) |
ex090_signal_rmi_combo |
Signal + RMI 혼합 |
ex091_property_rmi |
프로퍼티 RMI |
ex100_direct_update_ui |
Qt UI 직접 업데이트 |
ex110_smblock |
SmBlock 공유 메모리 IPC |
ex120_task |
태스크 고급 패턴 |
ex130_camera |
IMI 카메라 (CamProperty) |
ex130a_camera |
IMI 카메라 (DeviceProperty) |
ex130b_camera_webcam |
웹캠 |
ex140_performance |
성능 측정 |
ex150_dynamic_task |
동적 태스크 생성/제거 |
ex160_device_property |
DeviceProperty 데모 |
ex170_web_debugger |
웹 디버거 |
ex180_JoyStick |
조이스틱 제어 |
ex510_save_image |
이미지 저장 |
Monitoring
http://localhost:7000 (설정 포트)에서 웹 대시보드 접근.
- 태스크 상태 (alive/stopped/restart 횟수)
- RMI 호출 통계 (횟수, 응답시간 min/avg/max)
- Signal 통계 (Latency, TPS, QoS 위반)
- CPU/메모리 사용량 (psutil)
- SmBlock 풀 사용률
- 런타임 설정 편집 / 변수 조회
Repository Structure
2026_0130_alask_v2/
├── src/py_alaska/ # 패키지 소스
├── example/ # 실행 가능한 예제 (ex010 ~ ex510)
├── tests/ # 자동화 시험
│ ├── test_0_sm_infra*.py # SmInfra 단위·경합·성능 시험
│ ├── test_1_*.py # IPC / Signal 통합 시험
│ └── archive/ # 구버전 시험 (v2.0~v2.3)
├── docs/ # 설계 문서
│ ├── core/ # SmInfra 설계 · 성능 · 수정계획
│ ├── task/ # Task 시스템 · 생명주기 · IPC/Signal 사용
│ ├── monitor/ # 디버그 · 웹디버거
│ ├── app/ # 예제 · 응용 설계
│ ├── operation/ # 개발자 가이드 · 수정이력 · 코드리뷰
│ └── reports/ # 성능 측정 결과
├── divnote-mcp/ # Divnote MCP 서버 (Node.js)
├── onai/ # AI 프롬프트 도구
└── x_deploy_tool/ # 배포 유틸리티
Module Structure
py_alaska/
│
├── core/ ← 핵심 태스크 실행 프레임워크
│ │
│ ├── [Public API]
│ ├── task_manager.py # TaskManager — 태스크 등록·시작·정지·재시작
│ ├── task_signal.py # SignalBroker, SignalClient, SubscriberCache
│ ├── task_signal_decl.py # TSignal, BoundTSignal, @on 데코레이터 ← v2.7
│ ├── task_decorator.py # @task, @rmi_task 데코레이터
│ ├── gconfig.py # GConfig — JSON/YAML 설정 싱글턴
│ ├── task_error.py # 사용자 친화적 에러 메시지 + 예외 클래스
│ ├── task_performance.py # IpcMeasurement — RMI/Signal 성능 메트릭
│ ├── task_profiler.py # TaskProfiler — 코드 블록 실행 시간 측정
│ └── task_log.py # RmiLogger, LogTask — 중앙 로깅 시스템
│ │
│ └── [Internal]
│ ├── _rmi_client.py # RmiProtocol(바이너리), RmiClient, DirectClient
│ ├── _signal_core.py # QoS 프리셋, Signal dataclass, PriorityScheduler
│ ├── _task_runtime.py # TaskRuntime + InvokeDispenser (Signal+RMI 통합 디스패처)
│ ├── _task_validator.py # @task 선언 검증 (순환 의존 등)
│ ├── _config_infra.py # GConfig 예외 11종, FileLock, PathParser
│ ├── _log_handler.py # 멀티프로세스 안전 RotatingFileHandler
│ └── _comm_utils.py # 디버그 포맷, 체인 감지, 비동기 워커
│
├── sm_infra/ ← 공유 메모리 인프라 (L0~L3 계층)
│ ├── _base.py # _ShmBase — 모든 SHM 클래스 공통 기반
│ ├── sm_ring_buffer.py # SmRingBuffer — Lock-free SPSC (struct+memoryview)
│ ├── sm_block.py # SmBlock — Zero-copy 이미지 블록 풀 (numpy)
│ ├── sm_value.py # SmValue — 프로세스 간 고속 스칼라 공유
│ ├── sm_queue.py # SmQueue — SmRingBuffer + Event 기반 IPC 큐
│ ├── sm_signal.py # SmSignalRegistry(비트맵), SmSignalStats(통계)
│ ├── sm_blackbox.py # SmBlackBox — Signal 체인 세션 감시·경보
│ └── sm_sync.py # SmKernelEvent(Win32), SmLockFreeEvent, SmMutex
│
├── device/ ← 디바이스 속성 관리
│ ├── device_property.py # DeviceProperty — Python descriptor 기반 HW 속성
│ ├── device_schema.py # 키 파싱 ("name:dtype=default"), 조건 파싱
│ └── device_infra.py # DeviceTaskMixin — 캐시·타이머·resync 인프라
│
├── qt/ ← Qt(PySide6) UI 통합
│ ├── app.py # AlaskaApp.run() — Qt 앱 진입점
│ ├── decorators.py # @ui_thread — UI 스레드 안전 실행
│ ├── tab_camera.py # TabCamera — 카메라 뷰어 위젯
│ └── _zoom_view.py # ZoomView, CameraView — 확대/관심영역 뷰
│
├── monitor/ ← HTTP 웹 모니터링 대시보드
│ ├── task_monitor.py # TaskMonitor — HTTP 서버, REST API, 실시간 대시보드
│ ├── task_monitor_sysinfo.py# HwInfoCollector — CPU/메모리/네트워크 수집
│ ├── task_monitor_ext_link.py# Slack/Email/Webhook 외부 연동, 스케줄러
│ ├── task_monitor_html.py # 대시보드 HTML 템플릿
│ ├── task_monitor_debug_html.py # 디버그 뷰 HTML
│ └── task_monitor_css.py # 스타일시트
│
└── drives/ ← 하드웨어 드라이버
└── imi/ # IMI(동일비전) 카메라 드라이버
├── Neptune_API.py # NeptuneC DLL Python 바인딩
└── imi_camera.py # ImiCamera — SmBlock 연동 카메라 태스크
Requirements
- Python >= 3.10
- numpy
- opencv-python (optional)
- PySide6 (optional, Qt UI)
- psutil (optional, 시스템 모니터링)
License
Copyright (c) 동일비전(Dongil Vision Korea). All Rights Reserved. 무단 복제 및 배포를 금지합니다. 연구 목적의 개인 사용은 허용됩니다.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file py_alaska-0.1.30.tar.gz.
File metadata
- Download URL: py_alaska-0.1.30.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
60bbbe7ae1899add6a95a34be2c6ce7ab3574c3b23f65dc22a45376e74d3fcc7
|
|
| MD5 |
b275f3103fea0c3af85cc3f6e6596b39
|
|
| BLAKE2b-256 |
a5e6feedd7559635bb339b4c4545f9f3fac732403173c216bd35af25fa0aa0fc
|
File details
Details for the file py_alaska-0.1.30-py3-none-any.whl.
File metadata
- Download URL: py_alaska-0.1.30-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
27e8bbaa18f0df918e29b9007444a2a7f4ad6cc9f08c6a13f97c6a143ee59f03
|
|
| MD5 |
30351655be6df3d3ea858ce1d96d1730
|
|
| BLAKE2b-256 |
a0a945917167e04aa86772f3b653dcb2700d96b7e495017ba915a5894a20dd9b
|