2015-03-19 4 views
7

Я хочу запустить программу на Python, которая каждую секунду отправляет сообщение через веб-сокеты на сервер Tornado. Я использовал пример на websocket-client;Нитевидный, неблокирующий клиент websocket

Этот пример не работает, потому что ws.run_forever() остановит выполнение цикла while.

Может ли кто-нибудь дать мне пример того, как правильно реализовать это как потоковый класс, который я могу назвать методом отправки, но также получать сообщения?

import websocket 
import thread 
import time 

def on_message(ws, message): 
    print message 

def on_error(ws, error): 
    print error 

def on_close(ws): 
    print "### closed ###" 

def on_open(ws): 
    pass 

if __name__ == "__main__": 
    websocket.enableTrace(True) 
    ws = websocket.WebSocketApp("ws://echo.websocket.org/", on_message = on_message, on_error = on_error, on_close = on_close) 
    ws.on_open = on_open 
    ws.run_forever() 

    while True: 
     #do other actions here... collect data etc. 
     for i in range(100): 
      time.sleep(1) 
      ws.send("Hello %d" % i) 
     time.sleep(1) 

ответ

10

В их github page есть пример, который делает именно это. Похоже, вы начали с этого примера и взяли код, который отправляет сообщения каждую секунду из on_open и вставлял его после вызова run_forever, что BTW работает до тех пор, пока сокет не будет отключен.

Возможно, у вас возникли проблемы с основными понятиями здесь. Всегда будет поток, посвященный прослушиванию сокета (в этом случае основной поток, который входит в цикл внутри run_forever, ожидающий сообщений). Если вы хотите, чтобы что-то еще происходило, вам понадобится другой поток.

Ниже приведена другая версия их примерного кода, где вместо использования основного потока в качестве «прослушивателя сокетов» создается другой поток и запускается run_forever. Я считаю это более сложным, так как вам нужно написать код, чтобы убедиться, что сокет подключен, хотя вы можете использовать обратный вызов on_open, но, возможно, это поможет вам понять.

import websocket 
import threading 
from time import sleep 

def on_message(ws, message): 
    print message 

def on_close(ws): 
    print "### closed ###" 

if __name__ == "__main__": 
    websocket.enableTrace(True) 
    ws = websocket.WebSocketApp("ws://echo.websocket.org/", on_message = on_message, on_close = on_close) 
    wst = threading.Thread(target=ws.run_forever) 
    wst.daemon = True 
    wst.start() 

    conn_timeout = 5 
    while not ws.sock.connected and conn_timeout: 
     sleep(1) 
     conn_timeout -= 1 

    msg_counter = 0 
    while ws.sock.connected: 
     ws.send('Hello world %d'%msg_counter) 
     sleep(1) 
     msg_counter += 1 
+0

Весь сервер затем запускается в одном потоке? Что, если эта нить станет насыщенной? – Paul

+0

@Paul: Что вы подразумеваете под «насыщенным» здесь? – igaurav

+0

Я имел в виду, что если он использует несколько потоков, он может обрабатывать гораздо больше данных в секунду. С одним потоком я чувствую, что вы не используете весь ваш процессор, и этот поток может быть перегружен данными относительно быстро. – Paul

Смежные вопросы