WebSocket服务器的后台任务

1 投票
1 回答
1491 浏览
提问于 2025-04-18 11:45

我想搭建一个网络套接字服务器,用来和树莓派板子进行互动。具体来说,我想不断地检测一个传感器,处理来自网络套接字的输入,并根据需要启动一个电机。

我原本想在一个叫做 WebSocketServerProtocol 的子类里写一个 __init__ 方法,来负责传感器的检测和电机的运行,并用一个 onMessage() 方法来处理客户端的输入,返回系统的当前状态。不过,我担心我对 WebSocketServerProtocolWebSocketServerFactory 的理解不够深入,而且我似乎无法让后台任务在连接之间保持运行。

那么,怎样才能实现我想要的功能呢?也许使用 autobahn 有点过于复杂了——因为连接的电脑上只会有一个客户端,所以在这个意义上并不需要考虑并发的问题。我只是希望传感器的检测和电机的运行不会互相阻塞,以确保操作的流畅性。

1 个回答

1

你可以尝试把传感器的轮询和http/电机模块放在不同的线程里运行。

我觉得你可以很简单地解决这个问题,而不需要额外依赖autobahn。

可以看看Python自带的 SimpleHTTPServer(适用于python 2.x)或者 http.server(适用于python 3.x)模块。

你只需要创建一个 SimpleHTTPRequestHandler 类的子类,来提供一个 do_POST() 或者 do_GET() 方法,这些方法可以完成你的工作(它们可以替代你的 onMessage() 调用),大致结构如下:

import threading

from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer   import BaseHTTPServer

def poll():
   ...

class MyHandler(SimpleHTTPRequestHandler):
    protocol_version = "HTTP/1.0"
    def do_POST(self):
        if all_ok_with_the_request:
            motor.run()
    def do_GET(self):
        self.wfile.write("status = {}".format(status))

def runServer(address, port):
   httpd = BaseHTTPServer( (address, port), MyHandler )
   httpd.serve_forever()

threading.Thread(target=poll).run()
threading.Thread(target=runServer).run()

撰写回答