2017-08-12 2 views
0

J'essaye de me connecter simultanément à plusieurs canaux et de recevoir des messages d'une API push via la bibliothèque websocket de python. En considérant le code suivant ci-dessous, comment vous connecteriez-vous à plusieurs canaux? ce code a été obtenu et légèrement modifié à partir d'ici: https://pypi.python.org/pypi/websocket-clientWebsockets Python, abonnement à plusieurs canaux

Ce qui me trouble est la deuxième dernière ligne: ws.on_open = on_open. on_open est défini comme une fonction ci-dessus et prend 1 argument mais aucun argument n'est passé lors de l'appel de la fonction, je ne me souviens pas de l'avoir rencontré auparavant en code python, donc je ne sais pas vraiment ce qui se passe dans cette ligne.

Comment puis-je modifier ce code afin que je puisse transmettre une variable contenant une chaîne à la fonction on_open afin que je puisse spécifier le nom du Chanel auquel je veux m'abonner? Mon objectif principal est de pouvoir utiliser la bibliothèque multi-traitement pour passer plusieurs canaux à s'abonner simultanément.

Est-ce que j'accomplirais cela en créant plusieurs objets ws ou, un objet ws et en appelant on_open plusieurs fois avec différents canaux comme arguments?

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() 

Répondre

1

Utilisez partial pour passer des arguments supplémentaires

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 

Comme une note de côté, pensez à utiliser Tornado ou Crossbar.io (aka autobahn). Ce sont des frameworks asynchrones appropriés et simplifient le développement websocket par opposition aux threads et au multitraitement.