2016-11-17 8 views
0

Im создает программу на Python, которая считывает поток данных на неизвестном интервале. Эта программа также отправляет эти данные через websockets. Программа является сервером и отправляет полученные данные клиентам.Tornado отправить сообщение на событие

Это код сервера в настоящее время:

class WebSocketHandler(tornado.websocket.WebSocketHandler): 
    def initialize(self): 
     print 'Websocket opened' 

    def open(self): 
     print 'New connection' 
     self.write_message('Test from server') 

    def on_close(self): 
     print 'Connection closed' 

    def test(self): 
     self.write_message("scheduled!") 

def make_app(): 
    return tornado.web.Application([ 
    (r'/ws', WebSocketHandler), 
    ]) 

if __name__ == '__main__': 
    application = make_app() 

    http_server = tornado.httpserver.HTTPServer(application) 
    http_server.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 

Но я хочу, чтобы иметь возможность использовать write_message в этом цикле:

def read_function(): 
    while True: 
     time.sleep(10) # a while loop to simulate the reading 
     print 'read serial' 
     str = 'string to send' 
     # send message here to the clients 

Как я должен делать это?

EDIT: возникнут проблемы с обоими потоками, использующими соединения? Кажется, он работает с 1 соединением.

def read_function(): 
    while True: 
     time.sleep(5) # a while loop to simulate the reading 
     print 'read serial' 
     str = 'string to send' 
     [client.write_message(str) for client in connections] 

if __name__ == '__main__': 
    thread = Thread(target = read_function) 
    application = make_app() 
    http_server = tornado.httpserver.HTTPServer(application) 
    http_server.listen(8888) 
    thread.start() 
    tornado.ioloop.IOLoop.instance().start() 
    thread.join() 
+0

Возможно, вы также хотите, чтобы удалить соединение из набора, когда они отключены. –

ответ

1

Использование connections = set() вне WebsocketHandler и добавить к каждому клиенту при открытии соединения с connections.add(self). Не забудьте снять их при закрытии с помощью connections.remove(self).

Теперь вы можете получить доступ к write_message из WebSocket нити через: [client.write_message('#your_message') for client in connections]

+0

Спасибо! Но что было бы лучшим способом запустить read_function в другом потоке? Должен ли я просто создать отдельный поток со стандартной библиотекой потоков? Спасибо –

+0

Как называется эта функция? – Kjub

+0

Я просто вызываю его в основной функции. Он должен быть проверкой цикла для ввода, и когда theres input, он отправляет сообщение. Но сейчас я начал работать, просто положив его на другой поток. Мне просто интересно, есть ли у него хорошая практика. Я покажу основной текст в редакции. –