使用Python和Tornado运行后台任务

时间:2015-03-25 19:32:55

标签: python websocket raspberry-pi tornado raspberry-pi2

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

我已经设置了基于javascript websocket命令运行的Python Tornado。 这很棒,移动电机,打开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()

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"

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

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

调用我的python WS

正如我所说,工作精细

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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