【问题标题】:Background task for web socket serverWeb 套接字服务器的后台任务
【发布时间】:2014-07-01 16:27:41
【问题描述】:

我想运行一个 Web 套接字服务器来为树莓派板提供接口。具体来说,我想连续轮询传感器,参考变量处理来自网络套接字的输入,然后在需要时运行电机。

我认为我可以在子类 WebSocketServerProtocol 上使用 __init__ 方法,该方法执行轮询传感器和运行电机,并使用 onMessage() 方法来处理来自客户端的输入并返回当前状态系统,但是我担心我没有正确理解WebSocketServerProtocol 和WebSocketServerFactory,而且我似乎无法让后台任务在连接之间持续存在。

实现我想要的最佳方式是什么?也许高速公路是矫枉过正——在连接的计算机上永远只有一个客户端,所以从这个意义上说并发不是问题。我只是希望电机和轮询传感器的运行不要阻塞以确保平稳运行。

【问题讨论】:

  • 澄清一下,web socket 需要更新用于处理传感器数据和调整电机的临界值。然而,传感器/电机控制系统需要持续运行,而不仅仅是响应特定请求。

标签: python autobahn python-asyncio


【解决方案1】:

您可以做的一件事是在不同线程上运行传感器轮询和 http/motor 模块。

我认为您可以轻松解决您的问题,而无需为高速公路创建不必要的额外依赖项。

检查 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()

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多