Ultra fast asyncio event loop.
Go to file
Yury Selivanov c32c7039cd Fix KeyboardInterrupt handling logic.
When uvloop is run in the main thread we *always* want to set up a
self-pipe and a signal wakeup FD.  That's the only way how libuv
can be notified that a ^C happened and break away from selecting
on sockets.

asyncio does not need to do that, as the 'selectors' module it uses
is already aware of the way Python implements ^C handling.

This translates to a slightly different behavior between asyncio &
uvloop:

1. uvloop needs to always call signal.set_wakeup_fd() when run in the
  main thread;

2. asyncio only needs to call signal.set_wakeup_fd() when a user
  registers a signal handler.

(2) means that if the user had not set up any signals, the signal
wakeup FD stays the same between different asyncio runs.  This commit
fixes uvloop signal implementation to make sure that uvloop behaves
the same way as asyncio in regards to signal wakeup FD between the
loop runs.  It also ensures that uvloop always have a proper
self-pipe set up so that ^C is always supported when it is run in
the main thread.

Issue #295.
2019-10-28 22:53:26 -04:00
.ci Fix wheels upload 2019-10-25 17:03:54 -04:00
.github issue template: Ask if uvloop behaves differently from vanilla asyncio 2019-10-24 18:12:13 -04:00
docs Enforce consistent code style with flake8 2019-02-16 09:18:25 -05:00
examples/bench prefer PROTOCOL_TLS than PROTOCOL_SSLv23 2019-10-22 16:47:12 -04:00
tests Fix KeyboardInterrupt handling logic. 2019-10-28 22:53:26 -04:00
uvloop Fix KeyboardInterrupt handling logic. 2019-10-28 22:53:26 -04:00
vendor Bump libuv to v1.33.1 2019-10-24 17:28:39 -04:00
.editorconfig Add .editorconfig 2016-10-22 13:27:57 -04:00
.flake8 Enforce consistent code style with flake8 2019-02-16 09:18:25 -05:00
.gitignore Ignore mypy cache 2019-10-22 16:46:30 -04:00
.gitmodules Switch libuv submodule url to https 2016-02-03 18:32:09 -05:00
.travis.yml travis: Add 3.8 to the mix; drop "sudo" 2019-10-24 14:42:54 -04:00
LICENSE-APACHE Update license files for GH 2017-09-13 16:30:55 -04:00
LICENSE-MIT Dual-license uvloop under MIT and Apache 2.0 2016-07-05 15:04:11 -04:00
MANIFEST.in Update manifest.in to include both licenses 2016-07-05 15:25:09 -04:00
Makefile Unbreak CI 2018-05-30 14:35:11 -04:00
README.rst Note that it's recommended to upgrade pip before installing uvloop 2019-10-24 22:18:27 -04:00
performance.png readme: Add a section about uvloop performance 2016-05-22 14:47:25 -04:00
pytest.ini pytest: Show all warnings 2017-11-24 15:58:12 -05:00
requirements.dev.txt Bump Cython & pyOpenSSL deps to most recent 2019-10-24 14:42:54 -04:00
setup.py setup.py: Use raw string for regexp 2018-06-21 11:43:38 -04:00

README.rst

.. image:: https://travis-ci.org/MagicStack/uvloop.svg?branch=master
    :target: https://travis-ci.org/MagicStack/uvloop

.. image:: https://img.shields.io/pypi/v/uvloop.svg
    :target: https://pypi.python.org/pypi/uvloop

.. image:: https://pepy.tech/badge/uvloop
    :target: https://pepy.tech/project/uvloop
    :alt: PyPI - Downloads


uvloop is a fast, drop-in replacement of the built-in asyncio
event loop.  uvloop is implemented in Cython and uses libuv
under the hood.

The project documentation can be found
`here <http://uvloop.readthedocs.org/>`_.  Please also check out the
`wiki <https://github.com/MagicStack/uvloop/wiki>`_.


Performance
-----------

uvloop makes asyncio 2-4x faster.

.. image:: performance.png
    :target: http://magic.io/blog/uvloop-blazing-fast-python-networking/

The above chart shows the performance of an echo server with different
message sizes.  The *sockets* benchmark uses ``loop.sock_recv()`` and
``loop.sock_sendall()`` methods; the *streams* benchmark uses asyncio
high-level streams, created by the ``asyncio.start_server()`` function;
and the *protocol* benchmark uses ``loop.create_server()`` with a simple
echo protocol.  Read more about uvloop in a
`blog post <http://magic.io/blog/uvloop-blazing-fast-python-networking/>`_
about it.


Installation
------------

uvloop requires Python 3.5 or greater and is available on PyPI.
Use pip to install it::

    $ pip install uvloop

Note that it is highly recommended to **upgrade pip before** installing
uvloop with::

    $ pip install -U pip


Using uvloop
------------

Call ``uvloop.install()`` before calling ``asyncio.run()`` or
manually creating an asyncio event loop:

.. code:: python

    import asyncio
    import uvloop

    async def main():
        # Main entry-point.
        ...

    uvloop.install()
    asyncio.run(main())


Building From Source
--------------------

To build uvloop, you'll need Python 3.5 or greater:

1. Clone the repository:

   .. code::

    $ git clone --recursive git@github.com:MagicStack/uvloop.git
    $ cd uvloop

2. Create a virtual environment and activate it:

   .. code::

    $ python3.7 -m venv uvloop-dev
    $ source uvloop-dev/bin/activate

3. Install development dependencies:

   ..  code::

    $ pip install -r requirements.dev.txt

4. Build and run tests:

   .. code::

    $ make
    $ make test


License
-------

uvloop is dual-licensed under MIT and Apache 2.0 licenses.