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])
In dieser Struktur tun Datasocket und quoteSocket Arbeit auf demselben df oder zwei getrennte df? – kinreyli
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
Diese Struktur funktioniert gut. Bin dankbar! – kinreyli