Zach Marion
Zach Marion

Reputation: 77

How do I control an event loop?

I can't figure out how to handle an event loop such that I can run other code concurrently. I want to make it so when the handler receives data, it prints it without effecting anything else the program is doing.

I have tried wrapping trading_stream.run in an asyncio task, but this produces an error and isn't what I really want. It's like once I run the stream, my program is stuck inside the update_handler function.

from alpaca.trading.stream import TradingStream

trading_stream = TradingStream('api-key', 'secret-key', paper=True)

async def update_handler(data):
    # trade updates will arrive in our async handler
    print(data)

# subscribe to trade updates and supply the handler as a parameter
trading_stream.subscribe_trade_updates(update_handler)

# start our websocket streaming
trading_stream.run()

Upvotes: 0

Views: 327

Answers (1)

Ulisse Bordignon
Ulisse Bordignon

Reputation: 106

Premise: it would probably be best to understand what event loop is TradingStream using and, if possible, schedule tasks on that loop once retrieved, e.g.

trading_stream = TradingStream('api-key', 'secret-key', paper=True)

evt_loop = trading_stream.some_evt_loop_getter()

evt_loop.create_task(my_concurrent_task)

if TradingStream is using asyncio.get_event_loop() under the hood, then the following is also possible.

import asycio

trading_stream = TradingStream('api-key', 'secret-key', paper=True)

evt_loop = asyncio.get_event_loop()

evt_loop.create_task(my_concurrent_task)

Not being able to assess whether either of the above is the case, the following hack does solve your problem, but I would not resort to this unless the alternatives are not viable.

OTHER_LOGIC_FLAG = True


async def my_other_async_logic():
    # Concurrent logic here


async def update_handler(data):
    global OTHER_LOGIC_FLAG
    if OTHER_LOGIC_FLAG:
        asyncio.create_task(my_other_async_logic()
        OTHER_LOGIC_FLAG = False

    # trade updates will arrive in our async handler
    print(data)

Again, do try to get a handle to the event loop first.

Upvotes: 0

Related Questions