使用Python和Tornado运行后台任务

Jam*_*uma 0 python tornado websocket raspberry-pi raspberry-pi2

我已经做了几年的Web应用程序开发人员,现在正在使用Python和Robotics.

我已经设置了Python Tornado来运行基于javascript websocket命令.这很棒,移动电机,打开LED.不是问题.

我想做的2件事.

1)闪烁LED

2)使用超声波范围传感器,停止FORWARD动作IF范围<X

我知道如何在自己内部做两件事.

但是,我的python方式如下

WS.py

import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import time
# My Over python module
import tank

class WSHandler(tornado.websocket.WebSocketHandler):

    def open(self):

        print 'New connection was opened'
        self.write_message("Welcome to my websocket!")
        tank.init()

    def on_message(self, message):
        print 'Incoming message:', message
        tank.run(message)
        self.write_message("You said: " + message)

   def on_close(self):
       tank.end()
       print 'Connection was closed...'
   def check_origin(self, origin):
       return True
application = tornado.web.Application([
  (r'/ws', WSHandler),
])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)

TANK.py导入RPi.GPIO作为gpio导入时间

def init():
    #Setting up all my pins, Not going to add all

def moveForward():
    #open GPIO pins to move motors forward
def stop():
    # close all GPIO pins to stop motors

def run(action):
    # the method called by the IOLoop
    if action == 'go':
        moveForward()
    elif action == 'stop':
        stop()
    else:
        print "Oops, i cocked up"
Run Code Online (Sandbox Code Playgroud)

注意:tank.py是摘要而非实际代码.

我的JS在Mouse Down上工作,用go,mouse up,call stop来调用我的python WS

正如我所说,工作精细

但是如果我在moveForward()方法上添加一个while循环来计算范围并在关闭时停止,那么我的WS将被绑定而不是监听STOP

同样,如果我运行一个方法可以打开LED,睡眠,关闭,睡眠,我的WS将无法收听任何命令.

A. *_*vis 5

听起来你需要屈服于IOLoop,因此它可以处理更多输入,同时继续执行"moveForward".

如果你需要在moveForward中的循环之间暂停,请执行以下操作:

@gen.coroutine
def moveForward():
    while True:
        do_something()
        # Allow other processing while we wait 1 sec.
        yield gen.sleep(1)
Run Code Online (Sandbox Code Playgroud)

永远不要在Tornado回调或协程中使用"time.sleep",它会阻止整个过程的所有事件处理.请改用IOLoop.add_timeout或"yield gen.sleep(n)".