我试图实现这个简单的工作流程:python脚本运行守护进程线程。此线程使用多线程队列,并进行一些繁重的计算
当一些数据准备好了,线程应该能够告诉另一个连接到互联网的应用程序(在我的具体例子中是浏览器中的js应用程序)。在
现在,这听起来很简单。但我完全被第二部分卡住了。当客户机准备就绪时,我无法让线程将数据推送到客户机。在
我试过了:零rpc流。我设法传输数据,但是。。。我无法将计算的数据传递到此流。
网络插座。用Python设置ws似乎需要高级技能。。。我成功地设置了websocket服务器。它在线程中运行,并侦听客户端消息。但我无法将此服务器传递到我的计算线程,以便它可以通过它发送数据。
下面是一些示例代码:def init_socket_server(self, host='localhost', port='8765'):
# the socket handler
async def hello(websocket, path):
# that websocket object is what I need, but it lives in
# its own thread, I can't figure how to get it in other threads
name = await websocket.recv()
print("< {}".format(name))
greeting = "Hello {}!".format(name)
await websocket.send(greeting)
print("> {}".format(greeting))
# this object does not seem to be my actual server, just some init function?
start_server = websockets.serve(hello, host, port)
self.socket_server = start_server
# creating the thread
loop = asyncio.get_event_loop()
def start():
loop.run_until_complete(start_server)
loop.run_forever()
self.socket_thread = Thread(target=start, name="socket_server")
self.socket_thread.start()
这很棘手,因为我需要服务器在它自己的线程中运行,否则它会阻塞我的整个代码(我必须为其他目的运行多个线程,所以它们都必须在后台运行)。在
然而,我的self.socket_server = start_server似乎是错的。start_server似乎不是服务器本身,而是某个Serve对象。在
必须发送数据并在另一个线程中运行的队列:
^{pr2}$
它失败了,因为我的self.socket_server听起来不对。错误如下:AttributeError: 'Serve' object has no attribute 'send'
抱歉,如果这是一个dupe或noob问题,但我没有找到有用的resource(websockets/asyncio docs在这里没有真正的帮助…)。在
编辑:我设法用一个全局来共享websocketServer对象。但是它不起作用,我仍然有一个AttributeError: 'WebSocketServer' object has no attribute 'send'。我不明白为什么我的ws-server没有send方法。在
编辑2:你得到了更多的上下文,我正在开发一个电子应用程序。电子应用程序是一个chrome客户端,类似于任何web应用程序,以及一个本地节点服务器。这个应用程序还启动了一个python进程来进行计算。在
到目前为止,Python和JS代码以“同步”的方式与RPC调用通信:客户端请求数据,服务器接收请求并立即处理,然后响应请求。当计算变得繁重时,你不能按优先级排序。所以我实现了一个等待队列:计算请求被堆叠在这个队列中。这是更稳健,规模良好,并允许按优先级排序计算。在
但是现在计算在一个独立的线程中,这个线程运行一个消耗队列的无限循环。据我所知,这是使用队列的常见模式。但我没能把这些数据传回客户机。我希望这个计算线程能够发送事件到我的JS客户端,我尝试了零rpc流,我尝试了websockets,但没有成功。我可以将数据存储在另一个队列中,这样我就可以从websocket服务器所在的线程访问它们。但是,似乎您不能监听队列更改来触发事件,所以您需要一个无限循环来使用它,因此需要另一个线程。。。我想不通:)