2015-03-25 2 views
0

Я уже несколько лет являюсь разработчиком веб-приложений и теперь играю с Python и Robotics.Запуск фоновой задачи с Python и Tornado

Я установил Python Tornado для запуска на основе команд websocket javascript. Это замечательно, двигает двигатели, включает светодиоды. не проблема.

2 вещи, которые я хочу сделать.

1) Вспышка светодиоды

2) с помощью датчиков ультразвукового диапазона, остановить FORWARD действие IF диапазон < X

Я знаю, как это сделать, как в самом себе.

НО, как у меня есть питон следующим

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" 

NOTE : tank.py - сводный, а не фактический код.

My JS работает на мышь вниз, вызовите мой питон WS с ходом, кнопками мыши, вызовите остановить

Как я сказал, работает отлично

, но если добавить время цикла на moveForward() метод выработать диапазон и остановиться, если закрыть, тогда мой WS будет привязан и не будет прослушивать STOP

Аналогично, если я запускаю метод, который включает светодиод, спит, выключается, спит, My WS не сможет для прослушивания любых команд.

ответ

5

Похоже, вам нужно уступить IOLoop, чтобы он мог обрабатывать больше входных данных, в то же время продолжая выполнение в «moveForward».

Если вам нужно сделать паузу между петлями в moveForward, сделать что-то вроде:

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

Никогда не используйте «time.sleep» в обратном вызове Торнадо или сопрограммы, он блокирует все обработки событий для всего процесса. Вместо этого используйте IOLoop.add_timeout или «yield gen.sleep (n)».

+0

Лучше, чем постоянно работает фоновое задание. Работает с хорошим обаянием. Можете ли вы объяснить, почему мне нужно @ gen.coroutine –

+1

Торнадо «сопрограмма» - это параллельная задача, что-то вроде потока, которое может быть приостановлено и возобновлено. Когда он приостановлен, IOLoop может работать над другими задачами. Для получения дополнительной информации см. Мою статью: http://emptysqua.re/blog/refactoring-tornado-coroutines/ –