我正在进行一项科学实验,大约有二十多名测试人员互相进行回合制比赛。现在,它是一个带有WSGI接口的Python Web应用程序。我想用websockets增强可用性:当所有玩家完成转弯时,我想通知所有客户更新他们的状态。现在,每个人都必须等待转弯超时,或者不断重新加载并等待转弯仍在进行中#34;错误消息不再出现(忙等待,有效)。
我通读了多个websocket库'文档和我理解websockets如何工作,但我不确定混合WSGI和websockets的架构:我可以在同一个进程中有一个websockets和一个WSGI服务器(如果是这样,如何使用任何websockets库并且只是从WSGI处理程序调用{{1}},或者我应该有一个单独的websockets服务器并做一些IPC?或者我不应该混用它们吗?
编辑,6个月后:我最终启动了一个单独的websockets服务器进程(使用Autobahn),而不是将其与WSGI服务器集成。原因是将它们中的两个分开更加容易和清晰,并且从WSGI进程(服务器到服务器通信)与websockets服务器交谈是直截了当的,并使用{{3}进行了第一次尝试。 }。
答案 0 :(得分:14)
这是一个做你想做的事的例子:
它运行一个WSGI Web应用程序(在这种情况下基于Flask,但可以是符合WSGI的任何内容)以及1个服务器和1个端口下的WebSocket服务器。
您可以从Web处理程序中发送WS消息。 Autobahn还在WebSocket之上提供PubSub,这极大地简化了通知的发送(通过WampServerProtocol.dispatch
),就像你的情况一样。
披露:我是Autobahn的作者并为Tavendo工作。
答案 1 :(得分:1)
但是我不确定用于混合WSGI和websockets的体系结构
我做到了
使用WSocket
http 1.1
服务器。用于中间件,框架,应用程序 使用Bottle Web框架和WSocket中间件的示例
from bottle import request, Bottle
from wsocket import WSocketApp, WebSocketError, logger, run
from time import sleep
logger.setLevel(10) # for debugging
bottle = Bottle()
app = WSocketApp(bottle)
# app = WSocketApp(bottle, "WAMP")
@bottle.route("/")
def handle_websocket():
wsock = request.environ.get("wsgi.websocket")
if not wsock:
return "Hello World!"
while True:
try:
message = wsock.receive()
if message != None:
print("participator : " + message)
wsock.send("you : "+message)
sleep(2)
wsock.send("you : "+message)
except WebSocketError:
break
run(app)