2016-10-25 2 views
0

Ich schreibe eine Funktion, die sich mit zwei WebSockets beschäftigt, und die Antwort jedes WebSockets ändert einen gemeinsamen Datenrahmen df.Wie verarbeitet man mehrere WebSockets in Python auf FIFO-Art?

Ich bin mir nicht sicher, aber der aktuelle Code scheint abwechselnd zwei WebSockets zu verarbeiten. Ich möchte die Antwort in einer "First-In-First-Out" -Methode verarbeiten, unabhängig davon, von welchem ​​WebSocket es stammt. Wie sollte ich Änderungen vornehmen, um dieses Ziel zu erreichen?

Antwort

0

Da Sie die zwei yield from Anweisungen innerhalb der gleichen while-Schleife verwenden, werden sie in der Reihenfolge verarbeitet und dann ad infinitum wiederholt.

So wird es immer warten, bis es eine Antwort von dataSocket erhält und dann wird es warten, bis es eine Antwort von quoteSocket erhält, und dann spülen und wiederholen.

Tasks() funktionieren gut für das, was Sie versuchen, weil sie die Coroutinen unabhängig voneinander arbeiten lassen. Wenn Sie also zwei separate Coroutinen in ihren eigenen Task-Wrappern starten, wartet jeder auf seine eigene nächste Antwort, ohne den anderen zu stören.

Zum Beispiel:

import json 
import asyncio 
import websockets 

@asyncio.coroutine 
def coroutine_1(df, dataSocket): 
    yield from dataSocket.send(dataRequest) 
    response = yield from dataSocket.recv()  # skip first response 
    while True: 
     response = yield from dataSocket.recv() 
     print("<< {}".format(json.loads(response))) 
     df = changeRecord(df, response) 

@asyncio.coroutine 
def coroutine_2(df, quoteSocket): 
    yield from quoteSocket.send(quoteRequest) 
    response = yield from quoteSocket.recv() # skip first response 
    while True: 
     response = yield from quoteSocket.recv() 
     print("<< {}".format(json.loads(response))) 
     df = changeRecord(df, response) 

@asyncio.coroutine 
def printResponse(df, dataSocket, quoteSocket): 

    websocket_task_1 = asyncio.ensure_future(coroutine_1(df, dataSocket)) 
    websocket_task_2 = asyncio.ensure_future(coroutine_2(df, quoteSocket)) 

    yield from asyncio.wait([websocket_task_1, websocket_task_2]) 
+0

In dieser Struktur tun Datasocket und quoteSocket Arbeit auf demselben df oder zwei getrennte df? – kinreyli

+0

Mein Ziel ist es, die Antwort von beiden WebSockets funktioniert auf der gleichen df. Der von datasocket aktualisierte df sollte verfügbar sein, um die Antwort von socket zu zitieren. – kinreyli

+0

Diese Struktur funktioniert gut. Bin dankbar! – kinreyli

Verwandte Themen