Skip to content

Commit 766c901

Browse files
committed
Added KeyboardInterrupt handling to exit cleanly
1 parent 49c6197 commit 766c901

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

alpaca_trade_api/polygon/stream2.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
from .entity import (
88
Quote, Trade, Agg, Entity,
99
)
10+
import logging
1011

1112

1213
class StreamConn(object):
1314
def __init__(self, key_id=None):
14-
self._key_id = key_id
15+
self._key_id = key_id or os.environ.get('APCA_API_KEY_ID')
1516
self._endpoint = os.environ.get(
1617
'POLYGON_WS_URL',
1718
'wss://alpaca.socket.polygon.io/stocks'
@@ -22,6 +23,7 @@ def __init__(self, key_id=None):
2223
self._retry = int(os.environ.get('APCA_RETRY_MAX', 3))
2324
self._retry_wait = int(os.environ.get('APCA_RETRY_WAIT', 3))
2425
self._retries = 0
26+
self.loop = asyncio.get_event_loop()
2527

2628
async def connect(self):
2729
await self._dispatch({'ev': 'status',
@@ -84,6 +86,9 @@ async def _recv(self):
8486
msg = json.loads(r)
8587
for update in msg:
8688
yield update
89+
except websockets.exceptions.ConnectionClosed:
90+
# This error occurs when we self.close() such as on KeyboardInterrupt
91+
pass
8792
except websockets.exceptions.ConnectionClosedError as e:
8893
await self._dispatch({'ev': 'status',
8994
'status': 'disconnected',
@@ -164,12 +169,15 @@ def run(self, initial_channels=[]):
164169
'''Run forever and block until exception is raised.
165170
initial_channels is the channels to start with.
166171
'''
167-
loop = asyncio.get_event_loop()
172+
loop = self.loop
168173
try:
169174
loop.run_until_complete(self.subscribe(initial_channels))
170175
loop.run_forever()
176+
except KeyboardInterrupt:
177+
logging.info("Exiting on Interrupt")
171178
finally:
172179
loop.run_until_complete(self.close())
180+
loop.close()
173181

174182
async def close(self):
175183
'''Close any of open connections'''

alpaca_trade_api/stream2.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from .common import get_base_url, get_credentials
66
from .entity import Account, Entity
77
from . import polygon
8+
import logging
89

910

1011
class StreamConn(object):
@@ -16,6 +17,7 @@ def __init__(self, key_id=None, secret_key=None, base_url=None):
1617
self._base_url = base_url
1718
self._ws = None
1819
self.polygon = None
20+
self.loop = asyncio.get_event_loop()
1921

2022
async def _connect(self):
2123
ws = await websockets.connect(self._endpoint)
@@ -124,12 +126,15 @@ def run(self, initial_channels=[]):
124126
'''Run forever and block until exception is rasised.
125127
initial_channels is the channels to start with.
126128
'''
127-
loop = asyncio.get_event_loop()
129+
loop = self.loop
128130
try:
129131
loop.run_until_complete(self.subscribe(initial_channels))
130132
loop.run_forever()
133+
except KeyboardInterrupt:
134+
logging.info("Exiting on Interrupt")
131135
finally:
132136
loop.run_until_complete(self.close())
137+
loop.close()
133138

134139
async def close(self):
135140
'''Close any of open connections'''

0 commit comments

Comments
 (0)