WebSocket服务器的后台任务
我想搭建一个网络套接字服务器,用来和树莓派板子进行互动。具体来说,我想不断地检测一个传感器,处理来自网络套接字的输入,并根据需要启动一个电机。
我原本想在一个叫做 WebSocketServerProtocol
的子类里写一个 __init__
方法,来负责传感器的检测和电机的运行,并用一个 onMessage()
方法来处理客户端的输入,返回系统的当前状态。不过,我担心我对 WebSocketServerProtocol
和 WebSocketServerFactory
的理解不够深入,而且我似乎无法让后台任务在连接之间保持运行。
那么,怎样才能实现我想要的功能呢?也许使用 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()