Skip to content

Instantly share code, notes, and snippets.

@timkpaine
Created November 17, 2024 20:43
Show Gist options
  • Save timkpaine/03d23e2f5de2a92c2d38d1951824baf4 to your computer and use it in GitHub Desktop.
Save timkpaine/03d23e2f5de2a92c2d38d1951824baf4 to your computer and use it in GitHub Desktop.
<html>
<head>
<script type="module" src="https://cdn.jsdelivr.net/npm/@finos/perspective/dist/cdn/perspective.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/npm/@finos/perspective-viewer/dist/cdn/perspective-viewer.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/npm/@finos/perspective-viewer-datagrid/dist/cdn/perspective-viewer-datagrid.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/npm/@finos/perspective-viewer-d3fc/dist/cdn/perspective-viewer-d3fc.js"></script>
<link rel="stylesheet" crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/@finos/perspective-viewer/dist/css/pro.css"/>
<style>
perspective-viewer {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
display: flex;
flex-direction: column;
}
</style>
</head>
<body>
<perspective-viewer id="viewer"></perspective-viewer>
</body>
<script type="module">
import perspective from "https://cdn.jsdelivr.net/npm/@finos/perspective/dist/cdn/perspective.js";
window.addEventListener("DOMContentLoaded", async function () {
const websocket = await perspective.websocket("ws://localhost:8000/websocket");
const worker = perspective.worker();
await document.getElementById("viewer").load(websocket.open_table("test"));
});
</script>
</html>
Example of perspective multiworker webserver (independent perspective instances)
```bash
uvicorn server:app --workers 4
```
import asyncio
import random
from fastapi import FastAPI, WebSocket
from perspective import Server
from perspective.handlers.starlette import PerspectiveStarletteHandler
from starlette.staticfiles import StaticFiles
loop = asyncio.get_event_loop()
app = FastAPI()
perspective_server = Server()
async def websocket_handler(websocket: WebSocket):
await PerspectiveStarletteHandler(perspective_server=perspective_server, websocket=websocket).run()
app.add_api_websocket_route("/websocket", websocket_handler)
app.mount("/", StaticFiles(directory=".", html=True), name="static")
async def feed(table):
while True:
table.update([{"a": random.randint(0, 10), "index": 1}])
await asyncio.sleep(0.1)
@app.on_event("startup")
def startup():
client = perspective_server.new_local_client(loop_callback=asyncio.get_event_loop().call_soon_threadsafe)
table = client.table({"a": "integer", "index": "integer"}, index="index", name="test")
loop.create_task(feed(table))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment