2016-10-25 2 views
0

私は2つのWebSocketを扱う関数を書いており、各WebSocketの応答は共有DataFrame dfを変更します。PythonでFIFO方式で複数のWebSocketを処理する方法は?

import json 
import asyncio 
import websockets 

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

    yield from dataSocket.send(dataRequest) 
    yield from quoteSocket.send(quoteRequest) 

    response = yield from dataSocket.recv()  # skip first response 
    response = yield from quoteSocket.recv() # skip first response 

    while True: 

     response = yield from dataSocket.recv() 
     print("<< {}".format(json.loads(response))) 
     df = changeRecord(df, response) 

     response = yield from quoteSocket.recv() 
     print("<< {}".format(json.loads(response))) 
     df = changeRecord(df, response) 

現在のコードは、2つのWebSocketを順番に処理しているようです。私は、どのWebSocketから来ているかに関係なく、「先入れ先出し」の方法で応答を処理したいと考えています。この目標を達成するために私はどのように変更すべきですか?

答えて

0

同じwhileループ内に2つのyield fromステートメントを使用しているため、ループを順番に処理してから無限に繰り返します。

dataSocketから応答が得られるまで待ってから、quoteSocketから応答が得られるまで待ってからすすぎ、繰り返します。

Tasks()は、コルーチンが互いに独立して動作することができるため、何をしようとしているかに適しています。したがって、独自のタスクラッパーで2つの別々のコルーチンを開始すると、それぞれは、必ずしも他のものを妨害することなく、それぞれの次の応答を待つことになります。例えば

:この構造で

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

は、のDataSocketとquoteSocket同じDFの仕事や二つの別々のDFを行いますか? – kinreyli

+0

私の目標は、両方のWebSocketからの応答を同じdfで行うことです。 dataSocketによって更新されたdfは、quoteSocketの応答に利用可能でなければなりません。 – kinreyli

+0

この構造はうまくいきます。感謝します! – kinreyli

関連する問題