Files
2025-11-30 09:05:02 +08:00

2.6 KiB

Async Programming in Vuer

Overview

Vuer supports asynchronous programming patterns for handling parallel routines and callbacks. The tutorial demonstrates creating a server with background tasks running concurrently.

Key Components

Server Setup

The framework uses Vuer() to instantiate a server with configuration options via query parameters like reconnect=True and collapseMenu=True.

Main Function Decorator

The @app.spawn(start=True) decorator marks the entry point as an async function that starts the application immediately.

Task Management

Sessions provide spawn_task() method for launching background operations. Tasks can be cancelled with .cancel() when no longer needed.

Code Pattern Example

The tutorial shows a main loop that:

  • Spawns independent background tasks
  • Updates scene objects continuously using sess.upsert
  • Manages task lifecycle by cancelling long-running operations after conditions are met
  • Uses await sleep() for non-blocking delays

Complete Example

from vuer import Vuer
from vuer.schemas import Scene, Box
import asyncio
import numpy as np

app = Vuer(
    queries=dict(
        reconnect=True,
        collapseMenu=True,
    ),
)

async def background_task(session):
    """A background task that runs independently"""
    count = 0
    while True:
        print(f"Background task running: {count}")
        count += 1
        await asyncio.sleep(1.0)

@app.spawn(start=True)
async def main(session):
    # Spawn a background task
    task = session.spawn_task(background_task(session))

    # Main animation loop
    for i in range(100):
        theta = i * 0.1
        x = 0.5 * np.cos(theta)
        z = 0.5 * np.sin(theta)

        # Update the box position
        session.upsert @ Box(
            args=[0.1, 0.1, 0.1],
            position=[x, 0.05, z],
            color="red",
            materialType="standard",
            key="animated-box",
        )

        await asyncio.sleep(0.05)

    # Cancel the background task when done
    task.cancel()

app.run()

Practical Features

The demonstration animates a red box moving in a circular path while background tasks execute independently, illustrating how multiple asynchronous operations coexist within a single VuerSession without blocking the main rendering loop.

Best Practices

  1. Use session.spawn_task() for background operations
  2. Always use await asyncio.sleep() for delays to avoid blocking
  3. Cancel tasks when they're no longer needed to free resources
  4. Use session.upsert for updating scene components

Source

Documentation: https://docs.vuer.ai/en/latest/tutorials/basics/async_programming.html