WASM 프로세스

WASM 모듈은 process.wasm 엔트리 종류를 통해 프로세스로 실행될 수 있습니다. 프로세스는 Wippy 프로세스 호스트 내에서 실행되며 전체 프로세스 생명주기를 지원합니다: 스폰, 모니터링, 감독된 종료.

엔트리 설정

entries:
  - name: wasm_binaries
    kind: fs.directory
    directory: ./wasm

  - name: compute_worker
    kind: process.wasm
    fs: myns:wasm_binaries
    path: /worker.wasm
    hash: sha256:292b796376f8b4cc360acf2ea6b82d1084871c3607a079f30b446da8e5c984a4
    method: compute

설정 필드

Field Required Description
fs Yes 바이너리가 포함된 파일시스템 엔트리 ID
path Yes 파일시스템 내 .wasm 파일 경로
hash Yes 무결성 검증을 위한 SHA-256 해시
method Yes 실행할 내보내기된 함수 이름
imports No 활성화할 호스트 임포트
wasi No WASI 설정 (args, env, mounts)
limits No 실행 제한

CLI 명령

meta.command를 사용하여 WASM 프로세스를 이름이 있는 명령으로 등록합니다:

  - name: greet
    kind: process.wasm
    meta:
      command:
        name: greet
        short: Greet someone via WASM
    fs: myns:wasm_binaries
    path: /component.wasm
    hash: sha256:...
    method: greet

다음과 같이 실행합니다:

wippy run greet

사용 가능한 명령 목록을 확인합니다:

wippy run list
Field Required Description
name Yes wippy run <name>에서 사용하는 명령 이름
short No wippy run list에 표시되는 간단한 설명

CLI 명령이 동작하려면 terminal.hostprocess.host가 있어야 합니다.

프로세스 생명주기

WASM 프로세스는 Init/Step/Close 생명주기 모델을 따릅니다:

  1. Init - 모듈이 인스턴스화되고 입력 인자가 캡처됩니다
  2. Step - 실행이 진행됩니다. 비동기 모듈의 경우 스케줄러가 양보/재개 사이클을 구동합니다. 동기 모듈의 경우 단일 스텝에서 실행이 완료됩니다.
  3. Close - 인스턴스 리소스가 해제됩니다

Lua에서 스폰하기

WASM 프로세스를 스폰하고 완료를 모니터링합니다:

local process = require("process")
local time = require("time")

-- Spawn with monitoring
local pid, err = process.spawn_monitored(
    "myns:compute_worker",   -- entry ID
    "myns:processes",        -- process group
    6, 7                     -- arguments passed to the WASM function
)

if err then
    error("spawn failed: " .. tostring(err))
end

-- Wait for the process to complete
local event = process.receive(time.seconds(10))
if event and event.type == "EXIT" then
    local result = event.value  -- return value from the WASM function
end

비동기 실행

WASI 인터페이스를 임포트하는 WASM 프로세스는 비동기 연산을 수행할 수 있습니다. 스케줄러는 I/O 중에 프로세스를 일시 중단하고 연산이 완료되면 재개합니다:

  - name: http_worker
    kind: process.wasm
    fs: myns:wasm_binaries
    path: /http_worker.wasm
    hash: sha256:...
    method: run
    imports:
      - wasi:io
      - wasi:cli
      - wasi:http
    wasi:
      env:
        - id: myns:api_url
          name: API_URL
          required: true

양보/재개 메커니즘은 WASM 코드에 투명합니다. 게스트의 표준 블로킹 호출 (sleep, read, write, HTTP 요청)은 디스패처에 자동으로 양보합니다.

WASI 설정

프로세스는 함수와 동일한 WASI 설정을 지원합니다:

  - name: file_processor
    kind: process.wasm
    fs: myns:wasm_binaries
    path: /processor.wasm
    hash: sha256:...
    method: process
    imports:
      - wasi:cli
      - wasi:io
      - wasi:clocks
      - wasi:filesystem
    wasi:
      args: ["--input", "/data/input.csv"]
      cwd: "/app"
      env:
        - id: myns:output_format
          name: OUTPUT_FORMAT
      mounts:
        - fs: myns:input_data
          guest: /data
          read_only: true
        - fs: myns:output_dir
          guest: /output

참고