Why do you call set_event_loop() on Python 3.6 at all?

On Tue, Jul 11, 2017, 17:56 Chris Jerdonek <chris.jerdo...@gmail.com> wrote:

> There's something I realized about "creating and destroying" ephemeral
> event loops if you want to create temporary event loops over time in a
> synchronous application.
>
> This wasn't clear to me at the beginning, but it's actually more
> natural to do the reverse and "destroy and create," and **at the
> end**:
>
>     @contextmanager
>     def run_in_loop():
>         try:
>             yield
>         finally:
>             loop = asyncio.get_event_loop()
>             loop.close()
>             loop = asyncio.new_event_loop()
>             asyncio.set_event_loop(loop)
>
> The reason is that at the beginning of an application, the event loop
> starts out not closed. So if you start out by creating a new loop at
> the beginning, you'll get a warning like the following:
>
>   /usr/local/lib/python3.6/asyncio/base_events.py:509:
> ResourceWarning: unclosed event loop <_UnixSelectorEventLoop
> running=False closed=False debug=False>
>
> It's like the cycle is slightly out of phase.
>
> In contrast, if you create a new loop **at the end**, you're returning
> the application to the neutral state it was at the beginning, namely
> with a non-None loop that is neither running nor closed.
>
> I can think of three use cases for the context manager above:
>
> 1) for wrapping the "main" function of an application,
> 2) for calling async functions from a synchronous app (even from
> different threads), which is what I was originally asking about, and
> 3) as part of a decorator around individual unit tests to guarantee
> loop isolation.
>
> This seems like a really simple thing, but I haven't seen the pattern
> above written down anywhere (e.g. in past discussions of
> asyncio.run()).
>
> --Chris
>
>
> On Mon, Jul 10, 2017 at 7:46 AM, Guido van Rossum <gu...@python.org>
> wrote:
> > OK, then as long as close the connection and the loop properly it
> shouldn't
> > be a problem, even multi-threaded. (You basically lose all advantage of
> > async, but it seems you're fine with that.)
> >
> > On Sun, Jul 9, 2017 at 9:07 PM, Chris Jerdonek <chris.jerdo...@gmail.com
> >
> > wrote:
> >>
> >> On Sun, Jul 9, 2017 at 9:00 PM, Guido van Rossum <gu...@python.org>
> wrote:
> >> > But the big question is, what is that library doing for you? In the
> >> > abstract
> >> > it is hard to give you a good answer. What library is it? What calls
> are
> >> > you
> >> > making?
> >>
> >> It's the websockets library: https://github.com/aaugustin/websockets
> >>
> >> All I really need to do is occasionally connect briefly to a websocket
> >> server as a client from a synchronous app.
> >>
> >> Since I'm already using the library on the server-side, I thought I'd
> >> save myself the trouble of having to use two libraries and just use
> >> the same library on the client side as well.
> >>
> >> --Chris
> >>
> >>
> >>
> >>
> >> >
> >> > On Sun, Jul 9, 2017 at 8:48 PM, Chris Jerdonek
> >> > <chris.jerdo...@gmail.com>
> >> > wrote:
> >> >>
> >> >> I have a two-part question.
> >> >>
> >> >> If my application is single-threaded and synchronous (e.g. a web app
> >> >> using Gunicorn with sync workers [1]), and occasionally I need to
> call
> >> >> functions in a library that requires an event loop, is there any
> >> >> downside to creating and closing the loop on-the-fly only when I call
> >> >> the function? In other words, is creating and destroying loops cheap?
> >> >>
> >> >> Second, if I were to switch to a multi-threaded model (e.g. Gunicorn
> >> >> with async workers), is my only option to start the loop at the
> >> >> beginning of the process, and use loop.call_soon_threadsafe()? Or can
> >> >> I do what I was asking about above and create and close loops
> >> >> on-the-fly in different threads? Is either approach much more
> >> >> efficient than the other?
> >> >>
> >> >> Thanks,
> >> >> --Chris
> >> >>
> >> >> [1] http://docs.gunicorn.org/en/latest/design.html#sync-workers
> >> >> _______________________________________________
> >> >> Async-sig mailing list
> >> >> Async-sig@python.org
> >> >> https://mail.python.org/mailman/listinfo/async-sig
> >> >> Code of Conduct: https://www.python.org/psf/codeofconduct/
> >> >
> >> >
> >> >
> >> >
> >> > --
> >> > --Guido van Rossum (python.org/~guido)
> >
> >
> >
> >
> > --
> > --Guido van Rossum (python.org/~guido)
> _______________________________________________
> Async-sig mailing list
> Async-sig@python.org
> https://mail.python.org/mailman/listinfo/async-sig
> Code of Conduct: https://www.python.org/psf/codeofconduct/
>
-- 
Thanks,
Andrew Svetlov
_______________________________________________
Async-sig mailing list
Async-sig@python.org
https://mail.python.org/mailman/listinfo/async-sig
Code of Conduct: https://www.python.org/psf/codeofconduct/

Reply via email to