Python websockets, suscríbete a múltiples canales.

Estoy intentando conectarme a varios canales simultáneamente y recibir mensajes de una API de inserción a través de la biblioteca websocket de python.

Teniendo en cuenta el siguiente código a continuación, ¿cómo se conectaría a múltiples canales? este código se obtuvo y se modificó ligeramente desde aquí: https://pypi.python.org/pypi/websocket-client

Lo que me confunde es la segunda última línea: ws.on_open = on_open. on_open se define como una función de arriba y toma 1 argumento, pero no se pasa ningún argumento al llamar a la función, no recuerdo haber encontrado esto antes en el código de Python, así que no estoy seguro de lo que realmente está pasando en esta línea.

¿Cómo puedo modificar este código para que pueda pasar una variable que contenga una cadena a la función on_open para que pueda especificar el nombre del canal al que quiero suscribirme? Mi objective principal es poder utilizar la biblioteca de multiprocesamiento para pasar múltiples canales para suscribirse de forma simultánea.

¿Lograría esto creando múltiples objetos ws o, un objeto ws y llamando on_open varias veces con diferentes canales como argumentos?

import websocket import thread import time import json def on_message(ws, message): print(message) def on_error(ws, error): print(error) def on_close(ws): print("### closed ###") def on_open(ws): def run(*args): ws.send(json.dumps({'channel':'channel1'})) while True: time.sleep(1) ws.close() print("thread terminating...") thread.start_new_thread(run, ()) if __name__ == "__main__": websocket.enableTrace(True) ws = websocket.WebSocketApp("wss://random.example.com", on_message = on_message, on_error = on_error, on_close = on_close) ws.on_open = on_open ws.run_forever() 

Use partial para pasar en argumentos adicionales

 from functools import partial def on_open(ws, channel_name): """ Notice the channel_name parameter """ # create a new function with the predefined variable chan1 = partial(on_open, channel_name='channel 1') # set the new function as the on_open callback ws1.on_open = chan1 # do the same for the rest chan2 = partial(on_open, channel_name='channel 2') ws2.on_open = chan2 

Como nota al margen, considere usar Tornado o Crossbar.io (también conocido como autobahn ). Esos son marcos asíncronos adecuados y simplifican el desarrollo de websocket en lugar de subprocesos y multiprocesamiento.