2016-12-22 11 views
0

私は自分のpython(バージョン3.2.1)取引アプリケーションをForexプロバイダ(OANDA)の実践アカウントで構築していますが、 LinuxデービッドベースのOSでストリーミング価格。Python - リクエストモジュール - ストリーミングアップデートの受信 - ピアによる接続のリセット

特に、ここで利用可能な「Pythonストリーミングレート」ガイドに従っています:http://developer.oanda.com/rest-live/sample-code/

私はすべてのダニを出力関数「connect_to_stream」を呼び出したスレッドは、サーバから受け取った

streaming_thread = threading.Thread(target=streaming.connect_to_stream, args=[]) 
streaming_thread.start() 

をstreaming.connect_to_stream関数は、次のように定義されています

def connect_to_stream(): 

    [..]#provider-related info are passed here 

    try: 
     s = requests.Session() 
     url = "https://" + domain + "/v1/prices" 
     headers = {'Authorization' : 'Bearer ' + access_token, 
        'Connection' : 'keep-alive' 
        } 
     params = {'instruments' : instruments, 'accountId' : account_id} 
     req = requests.Request('GET', url, headers = headers, params = params) 
     pre = req.prepare() 
     resp = s.send(pre, stream = True, verify = False) 
     return resp 
    except Exception as e: 
     s.close() 
     print ("Caught exception when connecting to stream\n%s" % str(e)) 

    if response.status_code != 200: 
      print (response.text) 
      return 
    for line in response.iter_lines(1): 
     if line: 
      try: 
       msg = json.loads(line) 
       print(msg) 
      except Exception as e: 
       print ("Caught exception when connecting to stream\n%s" % str(e)) 
       return 

msg変数には、ストリーミングで受信したティックが含まれます。

問題は、平均3時間のティックを受信した後、接続が切断され、スクリプトが何もダンプを受信せずにハングしたり、理由が「Connection Reset by Peer」で例外をスローすることです。

ここで私が間違っている場所について考えてみてください。リクエストライブラリに何か関連していますか(iter_lines多分)?

キーボードの例外が発生しない限り、無期限にティックを受信したいと思います。サービスは3時間以上住んで接続を閉じるだろうと私にはあまりにも奇妙ないないよう

おかげ

答えて

0

これはおそらく、ゴーストクライアントからサーバーソケットを解放するための安全面です。

接続が切断されたときに再接続する必要があります。

try: 
    s = requests.Session() 
    url = "https://" + domain + "/v1/prices" 
    headers = {'Authorization' : 'Bearer ' + access_token, 
       'Connection' : 'keep-alive' 
       } 
    params = {'instruments' : instruments, 'accountId' : account_id} 
    req = requests.Request('GET', url, headers = headers, params = params) 
    pre = req.prepare() 
    resp = s.send(pre, stream = True, verify = False) 
    return resp 
except SocketError as e: 
    if e.errno == errno.ECONNRESET: 
     pass # connection has been reset, reconnect. 
except Exception as e: 
    pass # other exceptions but you'll probably need to reconnect too. 
+0

ご回答ありがとうございます。しかし、無限ループはforループがジェネレータresponse.iter_lines()を反復して開始します。あなたが提供した改善によって、最初に(成功した)レスポンスが受信された後にsocketErrorが発生した場合、例外を捕まえることはできません。受信したティックを反復処理する間、forループとは異なるものを使用してソケットエラーをキャッチする必要がありますか? – AntoG

関連する問題