-
-
Notifications
You must be signed in to change notification settings - Fork 38
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
What to do about calls to get_event_loop() in Trio context when no loop is active? #68
Comments
Third possible solution: create a dummy event loop object with a |
Would it be fair to say that in this library, this line too falls in this trap: |
Mostly, yes. Caching the current event loop is a bad idea these days. |
Thank you @smurfix I am currently using Since there's a lot of Is there a pattern we can come up with to handle this case reliably (short of putting a patch to the project that works with trio)? |
The way to handle this pattern reliably is to convince upstream not to use it in the first place. Yes, trio-asyncio could possibly add a workaround (or two or three …) for it, but (a) none of them reliably work in more complicated scenarios, (b) there are other use cases where this pattern goes splat. Example for (a): consider two libraries where both A and B set up a trio-asyncio loop. A starts its loop and calls B, which creates one of those objects (which stores a ref to A's loop), then starts its own separate trio-asyncio loop, making things go haywire because freely mixing calls to two different asyncio loops simply does not work. Example for (b): you might want to set up your objects in your main thread's sync code, but then you run the actual asyncio loop in a subthread while the main thread handles your GUI. |
@oremanj shared some more thoughts here: https://gitter.im/python-trio/general?at=609bea20012fc62dd5b44c97 |
Many asyncio objects (such as asyncio.Lock) call
asyncio.get_event_loop()
in their constructor, if no loop was passed. Much asyncio-using code seems to assume that such objects can be created when no loop is running, and that they'll attach themselves to the loop that winds up running later.This pattern works fine (at least post #66) outside of Trio context.
get_event_loop()
will delegate to the installed event loop policy; if no custom policy has been installed, it will return the event loop for the current thread, creating it as aSyncTrioEventLoop
if necessary.Inside Trio context, though, we currently expect every event loop to be a
TrioEventLoop
bound to anasync with open_loop()
block somewhere. If noTrioEventLoop
has yet been created, what can we do?get_event_loop()
. This caused problems for a user on gitter today: https://gitter.im/python-trio/general?at=5e1a40f2b720fa5b3cf9dbc4get_event_loop()
. This would have fixed the user's issue, but is confusing because it raises an error later (when someone tries to use the loop) without indicating why they got None.get_event_loop()
for the default asyncio event loop policy never returns None.which seems like it might still break some use cases.
Lock
would be in the global loop which is not the same loop as everything inside theasync with
block. And while I can't immediately think of a reason this wouldn't work, if it breaks it's going to be really confusing to understand.The text was updated successfully, but these errors were encountered: