python线上运行_从运行在s上的python线程将数据推送到远程客户端

我试图实现这个简单的工作流程: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服务器所在的线程访问它们。但是,似乎您不能监听队列更改来触发事件,所以您需要一个无限循环来使用它,因此需要另一个线程。。。我想不通:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值