feat: 添加 Session 亲和路由支持(NewSession / WithAffinity)
- 新增 NewSession(pool):返回固定到同一 worker 进程的 Pool 视图 - 新增 WithAffinity(ctx, key):相同 key 通过 FNV hash 稳定路由到同一 worker - pool.acquire 支持亲和路由,无亲和时保持轮询 - example 添加 Session / WithAffinity / 全局变量共享三组演示
This commit is contained in:
@@ -143,6 +143,45 @@ def get_user_via_go(uid: int) -> dict:
|
||||
return dataclasses.asdict(user)
|
||||
|
||||
|
||||
# ── Session 亲和示例 ──────────────────────────────────────────────────────────
|
||||
# _sessions 保存每个 session 的状态,key 由调用方提供
|
||||
_sessions: dict = {}
|
||||
|
||||
# _global_counter 是进程级全局变量,同一 worker 的所有 session 共享
|
||||
_global_counter: int = 0
|
||||
|
||||
|
||||
@expose
|
||||
def global_increment(delta: int) -> str:
|
||||
global _global_counter
|
||||
_global_counter += delta
|
||||
return f"[worker {worker_id}] counter = {_global_counter}"
|
||||
|
||||
|
||||
@expose
|
||||
def global_get() -> str:
|
||||
return f"[worker {worker_id}] counter = {_global_counter}"
|
||||
|
||||
|
||||
@expose
|
||||
def session_init(session_id: str, value: int) -> str:
|
||||
_sessions[session_id] = {"value": value, "steps": []}
|
||||
return f"[worker {worker_id}] session {session_id} init with {value}"
|
||||
|
||||
|
||||
@expose
|
||||
def session_step(session_id: str, delta: int) -> int:
|
||||
s = _sessions[session_id]
|
||||
s["value"] += delta
|
||||
s["steps"].append(delta)
|
||||
return s["value"]
|
||||
|
||||
|
||||
@expose
|
||||
def session_result(session_id: str) -> dict:
|
||||
return _sessions.pop(session_id)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run()
|
||||
print("worker_id", worker_id)
|
||||
|
||||
Reference in New Issue
Block a user