简体   繁体   中英

Python - Requests module - Receving streaming updates - Connection reset by peer

I have been building my own python (version 3.2.1) trading application in a practice account of a Forex provider (OANDA) but I am having some issues in receiving the streaming prices with a Linux debian-based OS.

In particular, I have followed their "Python streaming rates" guide available here: http://developer.oanda.com/rest-live/sample-code/ .

I have a thread calling the function 'connect_to_stream' which prints out all the ticks received from the server:

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

The streaming.connect_to_stream function is defined as following:

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

The msg variable contains the tick received for the streaming.

The problem is that I receive ticks for three hours on average after which the connection gets dropped and the script either hangs without receiving any ticks or throws an exception with reason "Connection Reset by Peer".

Could you please share any thoughts on where I am going wrong here? Is it anything related to the requests library (iter_lines maybe)?

I would like to receive ticks indefinitely unless a Keyboard exception is raised.

Thanks

That doesn't seem too weird to me that a service would close connections living for more than 3 hours.

That's probably a safety on their side to make sure to free their server sockets from ghost clients.

So you should probably just reconnect when you are disconnected.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM