CINXE.COM
Introduction - gevent 24.11.2.dev0 documentation
<!doctype html> <html class="no-js" lang="en" data-content_root="./"> <head><meta charset="utf-8"/> <meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="color-scheme" content="light dark"><meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="gevent – common functions" href="api/gevent.html" /><link rel="prev" title="Changes before gevent 1.0" href="changelog_pre.html" /> <!-- Generated with Sphinx 8.1.3 and Furo 2024.08.06 --> <title>Introduction - gevent 24.11.2.dev0 documentation</title> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a3258c64" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=354aac6f" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?v=302659d7" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=e405f49d" /> <style> body { --color-code-background: #eeeedd; --color-code-foreground: black; --color-brand-primary: #7c9a5e; --color-brand-content: #7c9a5e; --color-foreground-border: #b7d897; --font-stack: "SF Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"; --font-stack--monospace: "JetBrainsMono", "JetBrains Mono", "JetBrains Mono Regular", "JetBrainsMono-Regular", ui-monospace, profont, monospace; } @media not print { body[data-theme="dark"] { --color-code-background: #202020; --color-code-foreground: #d0d0d0; } @media (prefers-color-scheme: dark) { body:not([data-theme="light"]) { --color-code-background: #202020; --color-code-foreground: #d0d0d0; } } } </style><script async type="text/javascript" src="/_/static/javascript/readthedocs-addons.js"></script><meta name="readthedocs-project-slug" content="python-gevent" /><meta name="readthedocs-version-slug" content="latest" /><meta name="readthedocs-resolver-filename" content="/intro.html" /><meta name="readthedocs-http-status" content="200" /></head> <body> <script> document.body.dataset.theme = localStorage.getItem("theme") || "auto"; </script> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <symbol id="svg-toc" viewBox="0 0 24 24"> <title>Contents</title> <svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024"> <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/> </svg> </symbol> <symbol id="svg-menu" viewBox="0 0 24 24"> <title>Menu</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu"> <line x1="3" y1="12" x2="21" y2="12"></line> <line x1="3" y1="6" x2="21" y2="6"></line> <line x1="3" y1="18" x2="21" y2="18"></line> </svg> </symbol> <symbol id="svg-arrow-right" viewBox="0 0 24 24"> <title>Expand</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right"> <polyline points="9 18 15 12 9 6"></polyline> </svg> </symbol> <symbol id="svg-sun" viewBox="0 0 24 24"> <title>Light mode</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun"> <circle cx="12" cy="12" r="5"></circle> <line x1="12" y1="1" x2="12" y2="3"></line> <line x1="12" y1="21" x2="12" y2="23"></line> <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line> <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line> <line x1="1" y1="12" x2="3" y2="12"></line> <line x1="21" y1="12" x2="23" y2="12"></line> <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line> <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line> </svg> </symbol> <symbol id="svg-moon" viewBox="0 0 24 24"> <title>Dark mode</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon"> <path stroke="none" d="M0 0h24v24H0z" fill="none" /> <path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /> </svg> </symbol> <symbol id="svg-sun-with-moon" viewBox="0 0 24 24"> <title>Auto light/dark, in light mode</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-custom-derived-from-feather-sun-and-tabler-moon"> <path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/> <line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/> <line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/> <line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/> <line x1="19" y1="14.05" x2="20.414" y2="15.464"/> <line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/> <line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/> <line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/> <line x1="19" y1="5.05" x2="20.414" y2="3.636"/> <circle cx="14.5" cy="9.55" r="3.6"/> </svg> </symbol> <symbol id="svg-moon-with-sun" viewBox="0 0 24 24"> <title>Auto light/dark, in dark mode</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-custom-derived-from-feather-sun-and-tabler-moon"> <path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/> <line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/> <line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/> <line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/> <line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/> <line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/> <line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/> <line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/> <line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/> <circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/> </svg> </symbol> <symbol id="svg-pencil" viewBox="0 0 24 24"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code"> <path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" /> <path d="M13.5 6.5l4 4" /> <path d="M20 21l2 -2l-2 -2" /> <path d="M17 17l-2 2l2 2" /> </svg> </symbol> <symbol id="svg-eye" viewBox="0 0 24 24"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code"> <path stroke="none" d="M0 0h24v24H0z" fill="none" /> <path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /> <path d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" /> <path d="M20 21l2 -2l-2 -2" /> <path d="M17 17l-2 2l2 2" /> </svg> </symbol> </svg> <input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation"> <input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc"> <label class="overlay sidebar-overlay" for="__navigation"> <div class="visually-hidden">Hide navigation sidebar</div> </label> <label class="overlay toc-overlay" for="__toc"> <div class="visually-hidden">Hide table of contents sidebar</div> </label> <a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a> <div class="page"> <header class="mobile-header"> <div class="header-left"> <label class="nav-overlay-icon" for="__navigation"> <div class="visually-hidden">Toggle site navigation sidebar</div> <i class="icon"><svg><use href="#svg-menu"></use></svg></i> </label> </div> <div class="header-center"> <a href="contents.html"><div class="brand">gevent 24.11.2.dev0 documentation</div></a> </div> <div class="header-right"> <div class="theme-toggle-container theme-toggle-header"> <button class="theme-toggle"> <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div> <svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg> <svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg> <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg> <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg> </button> </div> <label class="toc-overlay-icon toc-header-icon" for="__toc"> <div class="visually-hidden">Toggle table of contents sidebar</div> <i class="icon"><svg><use href="#svg-toc"></use></svg></i> </label> </div> </header> <aside class="sidebar-drawer"> <div class="sidebar-container"> <div class="sidebar-sticky"><a class="sidebar-brand" href="contents.html"> <div class="sidebar-logo-container"> <img class="sidebar-logo" src="_static/5564530.png" alt="Logo"/> </div> </a><form class="sidebar-search-container" method="get" action="search.html" role="search"> <input class="sidebar-search" placeholder="Search" name="q" aria-label="Search"> <input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="area" value="default"> </form> <div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree"> <ul class="current"> <li class="toctree-l1"><a class="reference internal" href="install.html">Installation and Requirements</a></li> <li class="toctree-l1 has-children"><a class="reference internal" href="changelog.html">Changelog</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Changelog</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l2"><a class="reference internal" href="changelog_1_5.html">Changes for 1.5</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_1_4.html">Changes for 1.4</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_1_3.html">Changes for 1.3</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_1_2.html">Changes for 1.2</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_1_1.html">Changes for 1.1</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_1_0.html">Changes for 1.0</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_pre.html">Changes before gevent 1.0</a></li> </ul> </li> <li class="toctree-l1 current current-page"><a class="current reference internal" href="#">Introduction</a></li> <li class="toctree-l1"><a class="reference internal" href="api/gevent.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent</span></code> – common functions</a></li> <li class="toctree-l1"><a class="reference internal" href="api/gevent.greenlet.html">Greenlet Objects</a></li> <li class="toctree-l1"><a class="reference internal" href="servers.html">Implementing servers</a></li> <li class="toctree-l1 has-children"><a class="reference internal" href="dns.html">Name Resolution (DNS)</a><input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><div class="visually-hidden">Toggle navigation of Name Resolution (DNS)</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l2"><a class="reference internal" href="api/gevent.resolver.thread.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.resolver.thread</span></code> – thread based hostname resolver</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.resolver.ares.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.resolver.ares</span></code> – c-ares based hostname resolver</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.resolver.dnspython.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.resolver.dnspython</span></code> – Pure Python hostname resolver</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.resolver.blocking.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.resolver.blocking</span></code> – Non-cooperative resolver</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="monitoring.html">Monitoring and Debugging gevent Applications</a></li> <li class="toctree-l1"><a class="reference internal" href="loop_impls.html">Event Loop Implementations: libuv and libev</a></li> <li class="toctree-l1"><a class="reference internal" href="configuration.html">Configuring gevent</a></li> </ul> <ul> <li class="toctree-l1 has-children"><a class="reference internal" href="api/index.html">API reference</a><input class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><div class="visually-hidden">Toggle navigation of API reference</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l2"><a class="reference internal" href="api/gevent.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent</span></code> – common functions</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.timeout.html">Cooperative Timeouts Using <code class="docutils literal notranslate"><span class="pre">gevent.Timeout</span></code></a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.greenlet.html">Greenlet Objects</a></li> <li class="toctree-l2 has-children"><a class="reference internal" href="api/gevent.socket.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.socket</span></code> – Cooperative low-level networking interface</a><input class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><div class="visually-hidden">Toggle navigation of gevent.socket – Cooperative low-level networking interface</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="api/gevent._socket3.html">Python 3 interface</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.ssl.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.ssl</span></code> – Secure Sockets Layer (SSL/TLS) module</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.select.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.select</span></code> – Waiting for I/O completion</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.selectors.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.selectors</span></code> – High-level IO Multiplexing</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.event.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.event</span></code> – Notifications of multiple listeners</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.queue.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.queue</span></code> – Synchronized queues</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.local.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.local</span></code> – Greenlet-local objects</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.lock.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.lock</span></code> – Locking primitives</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.hub.html"><code class="docutils literal notranslate"><span class="pre">gevent.hub</span></code> - The Event Loop and the Hub</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.core.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.core</span></code> - (deprecated) event loop abstraction</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent</span></code> – common functions</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.backdoor.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.backdoor</span></code> – Interactive greenlet-based network console that can be used in any process</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.baseserver.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.baseserver</span></code> – Base class for implementing servers</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.builtins.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.builtins</span></code> – gevent friendly implementations of builtin functions</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.contextvars.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.contextvars</span></code> – Cooperative <code class="docutils literal notranslate"><span class="pre">contextvars</span></code></a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.core.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.core</span></code> - (deprecated) event loop abstraction</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.event.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.event</span></code> – Notifications of multiple listeners</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.events.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.events</span></code> – Publish/subscribe event infrastructure</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.exceptions.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.exceptions</span></code> – Exceptions</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.fileobject.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.fileobject</span></code> – Wrappers to make file-like objects cooperative</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.hub.html"><code class="docutils literal notranslate"><span class="pre">gevent.hub</span></code> - The Event Loop and the Hub</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.local.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.local</span></code> – Greenlet-local objects</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.lock.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.lock</span></code> – Locking primitives</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.monkey.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.monkey</span></code> – Make the standard library cooperative</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.os.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.os</span></code> – Low-level operating system functions from <code class="xref py py-mod docutils literal notranslate"><span class="pre">os</span></code></a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.pool.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.pool</span></code> – Managing greenlets in a group</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.pywsgi.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.pywsgi</span></code> – A pure-Python, gevent-friendly WSGI server</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.queue.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.queue</span></code> – Synchronized queues</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.resolver.ares.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.resolver.ares</span></code> – c-ares based hostname resolver</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.resolver.blocking.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.resolver.blocking</span></code> – Non-cooperative resolver</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.resolver.dnspython.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.resolver.dnspython</span></code> – Pure Python hostname resolver</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.resolver.thread.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.resolver.thread</span></code> – thread based hostname resolver</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.select.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.select</span></code> – Waiting for I/O completion</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.selectors.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.selectors</span></code> – High-level IO Multiplexing</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.server.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.server</span></code> – TCP/SSL server</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.signal.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.signal</span></code> – Cooperative implementation of special cases of <code class="xref py py-func docutils literal notranslate"><span class="pre">signal.signal()</span></code></a></li> <li class="toctree-l2 has-children"><a class="reference internal" href="api/gevent.socket.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.socket</span></code> – Cooperative low-level networking interface</a><input class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><div class="visually-hidden">Toggle navigation of gevent.socket – Cooperative low-level networking interface</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="api/gevent._socket3.html">Python 3 interface</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.ssl.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.ssl</span></code> – Secure Sockets Layer (SSL/TLS) module</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.subprocess.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.subprocess</span></code> – Cooperative <code class="docutils literal notranslate"><span class="pre">subprocess</span></code> module</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.thread.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.thread</span></code> – Implementation of the standard <code class="xref py py-mod docutils literal notranslate"><span class="pre">thread</span></code> module that spawns greenlets</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.threading.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.threading</span></code> – Implementation of the standard <code class="xref py py-mod docutils literal notranslate"><span class="pre">threading</span></code> using greenlets</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.threadpool.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.threadpool</span></code> - A pool of native threads</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.time.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.time</span></code> – Makes <em>sleep</em> gevent aware</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.util.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.util</span></code> – Low-level utilities</a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.ares.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.ares</span></code> – Backwards compatibility alias for <code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.resolver.cares</span></code></a></li> <li class="toctree-l2"><a class="reference internal" href="api/gevent.wsgi.html"><code class="docutils literal notranslate"><span class="pre">gevent.wsgi</span></code> – Historical note only; does not exist</a></li> <li class="toctree-l2 has-children"><a class="reference internal" href="examples/index.html">Examples</a><input class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><div class="visually-hidden">Toggle navigation of Examples</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="examples/concurrent_download.html">Example concurrent_download.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/dns_mass_resolve.html">Example dns_mass_resolve.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/echoserver.html">Example echoserver.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/geventsendfile.html">Example geventsendfile.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/portforwarder.html">Example portforwarder.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/processes.html">Example processes.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/psycopg2_pool.html">Example psycopg2_pool.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/threadpool.html">Example threadpool.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/udp_client.html">Example udp_client.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/udp_server.html">Example udp_server.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/unixsocket_client.html">Example unixsocket_client.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/unixsocket_server.html">Example unixsocket_server.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/webproxy.html">Example webproxy.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/webpy.html">Example webpy.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/wsgiserver.html">Example wsgiserver.py</a></li> <li class="toctree-l3"><a class="reference internal" href="examples/wsgiserver_ssl.html">Example wsgiserver_ssl.py</a></li> </ul> </li> </ul> </li> </ul> <ul> <li class="toctree-l1 has-children"><a class="reference internal" href="development/index.html">Development</a><input class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><div class="visually-hidden">Toggle navigation of Development</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l2"><a class="reference internal" href="development/getting_started.html">Getting Started</a></li> <li class="toctree-l2"><a class="reference internal" href="development/installing_from_source.html">Installing From Source</a></li> <li class="toctree-l2"><a class="reference internal" href="development/running_tests.html">Running Tests</a></li> <li class="toctree-l2"><a class="reference internal" href="development/ci.html">Continuous integration</a></li> <li class="toctree-l2"><a class="reference internal" href="development/release_process.html">Release Process</a></li> </ul> </li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="success.html">Success stories</a></li> <li class="toctree-l1"><a class="reference internal" href="community.html">Community</a></li> <li class="toctree-l1 has-children"><a class="reference internal" href="older_releases.html">Information About Older Releases</a><input class="toctree-checkbox" id="toctree-checkbox-8" name="toctree-checkbox-8" role="switch" type="checkbox"/><label for="toctree-checkbox-8"><div class="visually-hidden">Toggle navigation of Information About Older Releases</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l2 has-children"><a class="reference internal" href="whatsnew_1_5.html">What’s new in gevent 1.5</a><input class="toctree-checkbox" id="toctree-checkbox-9" name="toctree-checkbox-9" role="switch" type="checkbox"/><label for="toctree-checkbox-9"><div class="visually-hidden">Toggle navigation of What’s new in gevent 1.5</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="changelog_1_5.html">Changes for 1.5</a></li> </ul> </li> <li class="toctree-l2 has-children"><a class="reference internal" href="whatsnew_1_4.html">What’s new in gevent 1.4</a><input class="toctree-checkbox" id="toctree-checkbox-10" name="toctree-checkbox-10" role="switch" type="checkbox"/><label for="toctree-checkbox-10"><div class="visually-hidden">Toggle navigation of What’s new in gevent 1.4</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="changelog_1_4.html">Changes for 1.4</a></li> </ul> </li> <li class="toctree-l2 has-children"><a class="reference internal" href="whatsnew_1_3.html">What’s new in gevent 1.3</a><input class="toctree-checkbox" id="toctree-checkbox-11" name="toctree-checkbox-11" role="switch" type="checkbox"/><label for="toctree-checkbox-11"><div class="visually-hidden">Toggle navigation of What’s new in gevent 1.3</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="changelog_1_3.html">Changes for 1.3</a></li> </ul> </li> <li class="toctree-l2 has-children"><a class="reference internal" href="whatsnew_1_2.html">What’s new in gevent 1.2</a><input class="toctree-checkbox" id="toctree-checkbox-12" name="toctree-checkbox-12" role="switch" type="checkbox"/><label for="toctree-checkbox-12"><div class="visually-hidden">Toggle navigation of What’s new in gevent 1.2</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="changelog_1_2.html">Changes for 1.2</a></li> </ul> </li> <li class="toctree-l2 has-children"><a class="reference internal" href="whatsnew_1_1.html">What’s new in gevent 1.1</a><input class="toctree-checkbox" id="toctree-checkbox-13" name="toctree-checkbox-13" role="switch" type="checkbox"/><label for="toctree-checkbox-13"><div class="visually-hidden">Toggle navigation of What’s new in gevent 1.1</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="changelog_1_1.html">Changes for 1.1</a></li> </ul> </li> <li class="toctree-l2 has-children"><a class="reference internal" href="whatsnew_1_0.html">What’s new in gevent 1.0</a><input class="toctree-checkbox" id="toctree-checkbox-14" name="toctree-checkbox-14" role="switch" type="checkbox"/><label for="toctree-checkbox-14"><div class="visually-hidden">Toggle navigation of What’s new in gevent 1.0</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="changelog_1_0.html">Changes for 1.0</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="changelog_1_5.html">Changes for 1.5</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_1_4.html">Changes for 1.4</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_1_3.html">Changes for 1.3</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_1_2.html">Changes for 1.2</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_1_1.html">Changes for 1.1</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_1_0.html">Changes for 1.0</a></li> <li class="toctree-l2"><a class="reference internal" href="changelog_pre.html">Changes before gevent 1.0</a></li> </ul> </li> </ul> </div> </div> </div> </div> </aside> <div class="main"> <div class="content"> <div class="article-container"> <a href="#" class="back-to-top muted-link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path> </svg> <span>Back to top</span> </a> <div class="content-icon-container"> <div class="theme-toggle-container theme-toggle-content"> <button class="theme-toggle"> <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div> <svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg> <svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg> <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg> <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg> </button> </div> <label class="toc-overlay-icon toc-content-icon" for="__toc"> <div class="visually-hidden">Toggle table of contents sidebar</div> <i class="icon"><svg><use href="#svg-toc"></use></svg></i> </label> </div> <article role="main" id="furo-main-content"> <section id="introduction"> <h1>Introduction<a class="headerlink" href="#introduction" title="Link to this heading">¶</a></h1> <p>gevent is a <a class="reference external" href="https://en.wikipedia.org/wiki/Coroutine">coroutine</a> -based <a class="reference external" href="http://python.org">Python</a> networking library that uses <a class="reference external" href="https://greenlet.readthedocs.io">greenlet</a> to provide a high-level synchronous API on top of the <a class="reference external" href="http://software.schmorp.de/pkg/libev.html">libev</a> or <a class="reference external" href="http://libuv.org">libuv</a> event loop.</p> <p>Features include:</p> <ul class="simple"> <li><p>Fast event loop based on <a class="reference external" href="http://software.schmorp.de/pkg/libev.html">libev</a> or <a class="reference external" href="http://libuv.org">libuv</a>.</p></li> <li><p>Lightweight execution units based on greenlets.</p></li> <li><p>API that re-uses concepts from the Python standard library (for examples there are <a class="reference external" href="http://www.gevent.org/api/gevent.event.html#gevent.event.Event">events</a> and <a class="reference external" href="http://www.gevent.org/api/gevent.queue.html#gevent.queue.Queue">queues</a>).</p></li> <li><p><a class="reference external" href="http://www.gevent.org/api/index.html#networking">Cooperative sockets with SSL support</a></p></li> <li><p><a class="reference external" href="http://www.gevent.org/dns.html">Cooperative DNS queries</a> performed through a threadpool, dnspython, or c-ares.</p></li> <li><p><a class="reference external" href="http://www.gevent.org/intro.html#monkey-patching">Monkey patching utility</a> to get 3rd party modules to become cooperative</p></li> <li><p>TCP/UDP/HTTP servers</p></li> <li><p>Subprocess support (through <a class="reference external" href="http://www.gevent.org/api/gevent.subprocess.html#module-gevent.subprocess">gevent.subprocess</a>)</p></li> <li><p>Thread pools</p></li> </ul> <p>gevent is <a class="reference external" href="http://blog.gevent.org/2010/02/27/why-gevent/">inspired by eventlet</a> but features a more consistent API, simpler implementation and better performance. Read why others <a class="reference external" href="http://groups.google.com/group/gevent/browse_thread/thread/4de9703e5dca8271">use gevent</a> and check out the list of the <a class="reference external" href="https://github.com/gevent/gevent/wiki/Projects">open source projects based on gevent</a>.</p> <p>gevent was written by <a class="reference external" href="http://denisbilenko.com/">Denis Bilenko</a>.</p> <p>Since version 1.1, gevent is maintained by Jason Madden for <a class="reference external" href="https://nextthought.com">NextThought</a> (through gevent 21) and <a class="reference external" href="https://www.issgovernance.com">Institutional Shareholder Services</a> with help from the <a class="reference external" href="https://github.com/gevent/gevent/graphs/contributors">contributors</a> and is licensed under the MIT license.</p> <p>See <a class="reference external" href="http://www.gevent.org/whatsnew_1_5.html">what’s new</a> in the latest major release.</p> <p>Check out the detailed <a class="reference external" href="http://www.gevent.org/changelog.html">changelog</a> for this version.</p> <section id="example"> <h2>Example<a class="headerlink" href="#example" title="Link to this heading">¶</a></h2> <p>The following example shows how to run tasks concurrently.</p> <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">gevent</span> <span class="gp">>>> </span><span class="kn">from</span> <span class="nn">gevent</span> <span class="kn">import</span> <span class="n">socket</span> <span class="gp">>>> </span><span class="n">urls</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'www.google.com'</span><span class="p">,</span> <span class="s1">'www.example.com'</span><span class="p">,</span> <span class="s1">'www.python.org'</span><span class="p">]</span> <span class="gp">>>> </span><span class="n">jobs</span> <span class="o">=</span> <span class="p">[</span><span class="n">gevent</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span> <span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">urls</span><span class="p">]</span> <span class="gp">>>> </span><span class="n">_</span> <span class="o">=</span> <span class="n">gevent</span><span class="o">.</span><span class="n">joinall</span><span class="p">(</span><span class="n">jobs</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> <span class="gp">>>> </span><span class="p">[</span><span class="n">job</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">job</span> <span class="ow">in</span> <span class="n">jobs</span><span class="p">]</span> <span class="go">['74.125.79.106', '208.77.188.166', '82.94.164.162']</span> </pre></div> </div> <p>After the jobs have been spawned, <a class="reference internal" href="api/gevent.html#gevent.joinall" title="gevent.joinall"><code class="xref py py-func docutils literal notranslate"><span class="pre">gevent.joinall()</span></code></a> waits for them to complete, allowing up to 2 seconds. The results are then collected by checking the <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.value" title="gevent.Greenlet.value"><code class="xref py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> property. The <a class="reference internal" href="api/gevent.socket.html#gevent.socket.gethostbyname" title="gevent.socket.gethostbyname"><code class="xref py py-func docutils literal notranslate"><span class="pre">gevent.socket.gethostbyname()</span></code></a> function has the same interface as the standard <a class="reference external" href="https://docs.python.org/3/library/socket.html#socket.gethostbyname" title="(in Python v3.13)"><code class="xref py py-func docutils literal notranslate"><span class="pre">socket.gethostbyname()</span></code></a> but it does not block the whole interpreter and thus lets the other greenlets proceed with their requests unhindered.</p> </section> <section id="monkey-patching"> <span id="id1"></span><h2>Monkey patching<a class="headerlink" href="#monkey-patching" title="Link to this heading">¶</a></h2> <p>The example above used <a class="reference internal" href="api/gevent.socket.html#module-gevent.socket" title="gevent.socket"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.socket</span></code></a> for socket operations. If the standard <a class="reference external" href="https://docs.python.org/3/library/socket.html#module-socket" title="(in Python v3.13)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">socket</span></code></a> module was used the example would have taken 3 times longer to complete because the DNS requests would be sequential (serialized). Using the standard socket module inside greenlets makes gevent rather pointless, so what about existing modules and packages that are built on top of <a class="reference external" href="https://docs.python.org/3/library/socket.html#module-socket" title="(in Python v3.13)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">socket</span></code></a> (including the standard library modules like <a class="reference external" href="https://docs.python.org/3/library/urllib.html#module-urllib" title="(in Python v3.13)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">urllib</span></code></a>)?</p> <p>That’s where monkey patching comes in. The functions in <a class="reference internal" href="api/gevent.monkey.html#module-gevent.monkey" title="gevent.monkey"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.monkey</span></code></a> carefully replace functions and classes in the standard <a class="reference external" href="https://docs.python.org/3/library/socket.html#module-socket" title="(in Python v3.13)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">socket</span></code></a> module with their cooperative counterparts. That way even the modules that are unaware of gevent can benefit from running in a multi-greenlet environment.</p> <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">gevent</span> <span class="kn">import</span> <span class="n">monkey</span><span class="p">;</span> <span class="n">monkey</span><span class="o">.</span><span class="n">patch_socket</span><span class="p">()</span> <span class="gp">>>> </span><span class="kn">import</span> <span class="nn">requests</span> <span class="c1"># it's usable from multiple greenlets now</span> </pre></div> </div> <p>See <a class="reference internal" href="examples/concurrent_download.html"><span class="doc">Example concurrent_download.py</span></a>.</p> <div class="admonition tip"> <p class="admonition-title">Tip</p> <p>Insight into the monkey-patching process can be obtained by observing the events <a class="reference internal" href="api/gevent.monkey.html#module-gevent.monkey" title="gevent.monkey"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.monkey</span></code></a> emits.</p> </div> <section id="beyond-sockets"> <h3>Beyond sockets<a class="headerlink" href="#beyond-sockets" title="Link to this heading">¶</a></h3> <p>Of course, there are several other parts of the standard library that can block the whole interpreter and result in serialized behavior. gevent provides cooperative versions of many of those as well. They can be patched independently through individual functions, but most programs using monkey patching will want to patch the entire recommended set of modules using the <a class="reference internal" href="api/gevent.monkey.html#gevent.monkey.patch_all" title="gevent.monkey.patch_all"><code class="xref py py-func docutils literal notranslate"><span class="pre">gevent.monkey.patch_all()</span></code></a> function:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">gevent</span> <span class="kn">import</span> <span class="n">monkey</span><span class="p">;</span> <span class="n">monkey</span><span class="o">.</span><span class="n">patch_all</span><span class="p">()</span> <span class="gp">>>> </span><span class="kn">import</span> <span class="nn">subprocess</span> <span class="c1"># it's usable from multiple greenlets now</span> </pre></div> </div> <div class="admonition tip"> <p class="admonition-title">Tip</p> <p>When monkey patching, it is recommended to do so as early as possible in the lifetime of the process. If possible, monkey patching should be the first lines executed. Monkey patching later, especially if native threads have been created, <a class="reference external" href="https://docs.python.org/3/library/atexit.html#module-atexit" title="(in Python v3.13)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">atexit</span></code></a> or signal handlers have been installed, or sockets have been created, may lead to unpredictable results including unexpected <a class="reference internal" href="api/gevent.hub.html#gevent.hub.LoopExit" title="gevent.hub.LoopExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">LoopExit</span></code></a> errors.</p> </div> </section> </section> <section id="event-loop"> <h2>Event loop<a class="headerlink" href="#event-loop" title="Link to this heading">¶</a></h2> <p>Instead of blocking and waiting for socket operations to complete (a technique known as polling), gevent arranges for the operating system to deliver an event letting it know when, for example, data has arrived to be read from the socket. Having done that, gevent can move on to running another greenlet, perhaps one that itself now has an event ready for it. This repeated process of registering for events and reacting to them as they arrive is the event loop.</p> <p>Unlike other network libraries, though in a similar fashion as eventlet, gevent starts the event loop implicitly in a dedicated greenlet. There’s no <code class="docutils literal notranslate"><span class="pre">reactor</span></code> that you must call a <code class="docutils literal notranslate"><span class="pre">run()</span></code> or <code class="docutils literal notranslate"><span class="pre">dispatch()</span></code> function on. When a function from gevent’s API wants to block, it obtains the <a class="reference internal" href="api/gevent.hub.html#gevent.hub.Hub" title="gevent.hub.Hub"><code class="xref py py-class docutils literal notranslate"><span class="pre">gevent.hub.Hub</span></code></a> instance — a special greenlet that runs the event loop — and switches to it (it is said that the greenlet <em>yielded</em> control to the Hub). If there’s no <a class="reference internal" href="api/gevent.hub.html#gevent.hub.Hub" title="gevent.hub.Hub"><code class="xref py py-class docutils literal notranslate"><span class="pre">Hub</span></code></a> instance yet, one is automatically created.</p> <div class="admonition tip"> <p class="admonition-title">Tip</p> <p>Each operating system thread has its own <a class="reference internal" href="api/gevent.hub.html#gevent.hub.Hub" title="gevent.hub.Hub"><code class="xref py py-class docutils literal notranslate"><span class="pre">Hub</span></code></a>. This makes it possible to use the gevent blocking API from multiple threads (with care).</p> </div> <p>The event loop uses the best polling mechanism available on the system by default.</p> <div class="admonition note"> <p class="admonition-title">Note</p> <p>A low-level event loop API is available under the <a class="reference internal" href="api/gevent.core.html#module-gevent.core" title="gevent.core"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.core</span></code></a> module. This module is not documented, not meant for general purpose usage, and its exact contents and semantics change slightly depending on whether the libev or libuv event loop is being used. The callbacks supplied to the event loop API are run in the <a class="reference internal" href="api/gevent.hub.html#gevent.hub.Hub" title="gevent.hub.Hub"><code class="xref py py-class docutils literal notranslate"><span class="pre">Hub</span></code></a> greenlet and thus cannot use the synchronous gevent API. It is possible to use the asynchronous API there, like <a class="reference internal" href="api/gevent.html#gevent.spawn" title="gevent.spawn"><code class="xref py py-func docutils literal notranslate"><span class="pre">gevent.spawn()</span></code></a> and <a class="reference internal" href="api/gevent.event.html#gevent.event.Event.set" title="gevent.event.Event.set"><code class="xref py py-meth docutils literal notranslate"><span class="pre">gevent.event.Event.set()</span></code></a>.</p> </div> </section> <section id="cooperative-multitasking"> <h2>Cooperative multitasking<a class="headerlink" href="#cooperative-multitasking" title="Link to this heading">¶</a></h2> <p>The greenlets all run in the same OS thread and are scheduled cooperatively. This means that until a particular greenlet gives up control, (by calling a blocking function that will switch to the <a class="reference internal" href="api/gevent.hub.html#gevent.hub.Hub" title="gevent.hub.Hub"><code class="xref py py-class docutils literal notranslate"><span class="pre">Hub</span></code></a>), other greenlets won’t get a chance to run. This is typically not an issue for an I/O bound app, but one should be aware of this when doing something CPU intensive, or when calling blocking I/O functions that bypass the event loop.</p> <div class="admonition tip"> <p class="admonition-title">Tip</p> <p>Even some apparently cooperative functions, like <a class="reference internal" href="api/gevent.html#gevent.sleep" title="gevent.sleep"><code class="xref py py-func docutils literal notranslate"><span class="pre">gevent.sleep()</span></code></a>, can temporarily take priority over waiting I/O operations in some circumstances.</p> </div> <p>Synchronizing access to objects shared across the greenlets is unnecessary in most cases (because yielding control is usually explicit), thus traditional synchronization devices like the <a class="reference internal" href="api/gevent.lock.html#gevent.lock.BoundedSemaphore" title="gevent.lock.BoundedSemaphore"><code class="xref py py-class docutils literal notranslate"><span class="pre">gevent.lock.BoundedSemaphore</span></code></a>, <a class="reference internal" href="api/gevent.lock.html#gevent.lock.RLock" title="gevent.lock.RLock"><code class="xref py py-class docutils literal notranslate"><span class="pre">gevent.lock.RLock</span></code></a> and <a class="reference internal" href="api/gevent.lock.html#gevent.lock.Semaphore" title="gevent.lock.Semaphore"><code class="xref py py-class docutils literal notranslate"><span class="pre">gevent.lock.Semaphore</span></code></a> classes, although present, aren’t used very often. Other abstractions from threading and multiprocessing remain useful in the cooperative world:</p> <ul class="simple"> <li><p><a class="reference internal" href="api/gevent.event.html#gevent.event.Event" title="gevent.event.Event"><code class="xref py py-class docutils literal notranslate"><span class="pre">Event</span></code></a> allows one to wake up a number of greenlets that are calling <a class="reference internal" href="api/gevent.event.html#gevent.event.Event.wait" title="gevent.event.Event.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code></a> method.</p></li> <li><p><a class="reference internal" href="api/gevent.event.html#gevent.event.AsyncResult" title="gevent.event.AsyncResult"><code class="xref py py-class docutils literal notranslate"><span class="pre">AsyncResult</span></code></a> is similar to <a class="reference internal" href="api/gevent.event.html#gevent.event.Event" title="gevent.event.Event"><code class="xref py py-class docutils literal notranslate"><span class="pre">Event</span></code></a> but allows passing a value or an exception to the waiters.</p></li> <li><p><a class="reference internal" href="api/gevent.queue.html#gevent.queue.Queue" title="gevent.queue.Queue"><code class="xref py py-class docutils literal notranslate"><span class="pre">Queue</span></code></a> and <a class="reference internal" href="api/gevent.queue.html#gevent.queue.JoinableQueue" title="gevent.queue.JoinableQueue"><code class="xref py py-class docutils literal notranslate"><span class="pre">JoinableQueue</span></code></a>.</p></li> </ul> </section> <section id="lightweight-pseudothreads"> <span id="greenlet-basics"></span><h2>Lightweight pseudothreads<a class="headerlink" href="#lightweight-pseudothreads" title="Link to this heading">¶</a></h2> <p>New greenlets are spawned by creating a <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet" title="gevent.Greenlet"><code class="xref py py-class docutils literal notranslate"><span class="pre">Greenlet</span></code></a> instance and calling its <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.start" title="gevent.Greenlet.start"><code class="xref py py-meth docutils literal notranslate"><span class="pre">start</span></code></a> method. (The <a class="reference internal" href="api/gevent.html#gevent.spawn" title="gevent.spawn"><code class="xref py py-func docutils literal notranslate"><span class="pre">gevent.spawn()</span></code></a> function is a shortcut that does exactly that). The <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.start" title="gevent.Greenlet.start"><code class="xref py py-meth docutils literal notranslate"><span class="pre">start</span></code></a> method schedules a switch to the greenlet that will happen as soon as the current greenlet gives up control. If there is more than one active greenlet, they will be executed one by one, in an undefined order as they each give up control to the <a class="reference internal" href="api/gevent.hub.html#gevent.hub.Hub" title="gevent.hub.Hub"><code class="xref py py-class docutils literal notranslate"><span class="pre">Hub</span></code></a>.</p> <p>If there is an error during execution it won’t escape the greenlet’s boundaries. An unhandled error results in a stacktrace being printed, annotated by the failed function’s signature and arguments:</p> <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">glet</span> <span class="o">=</span> <span class="n">gevent</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="k">lambda</span> <span class="p">:</span> <span class="mi">1</span><span class="o">/</span><span class="mi">0</span><span class="p">);</span> <span class="n">glet</span><span class="o">.</span><span class="n">join</span><span class="p">()</span> <span class="gp">>>> </span><span class="n">gevent</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="gt">Traceback (most recent call last):</span> <span class="w"> </span><span class="c">...</span> <span class="gr">ZeroDivisionError</span>: <span class="n">integer division or modulo by zero</span> <span class="x"><Greenlet at 0x7f2ec3a4e490: <function <lambda...>> failed with ZeroDivisionError</span> </pre></div> </div> <p>The traceback is asynchronously printed to <code class="docutils literal notranslate"><span class="pre">sys.stderr</span></code> when the greenlet dies.</p> <p><a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet" title="gevent.Greenlet"><code class="xref py py-class docutils literal notranslate"><span class="pre">Greenlet</span></code></a> instances have a number of useful methods:</p> <ul class="simple"> <li><p><a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.join" title="gevent.Greenlet.join"><code class="xref py py-meth docutils literal notranslate"><span class="pre">join</span></code></a> – waits until the greenlet exits;</p></li> <li><p><a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.kill" title="gevent.Greenlet.kill"><code class="xref py py-meth docutils literal notranslate"><span class="pre">kill</span></code></a> – interrupts greenlet’s execution;</p></li> <li><p><a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.get" title="gevent.Greenlet.get"><code class="xref py py-meth docutils literal notranslate"><span class="pre">get</span></code></a> – returns the value returned by greenlet or re-raises the exception that killed it.</p></li> </ul> <p>Greenlets can be subclassed with care. One use for this is to customize the string printed after the traceback by subclassing the <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet" title="gevent.Greenlet"><code class="xref py py-class docutils literal notranslate"><span class="pre">Greenlet</span></code></a> class and redefining its <code class="docutils literal notranslate"><span class="pre">__str__</span></code> method. For more information, see <a class="reference internal" href="api/gevent.greenlet.html#subclassing-greenlet"><span class="std std-ref">Subclassing Greenlet</span></a>.</p> <p>Greenlets can be killed synchronously from another greenlet. Killing will resume the sleeping greenlet, but instead of continuing execution, a <a class="reference internal" href="api/gevent.greenlet.html#gevent.GreenletExit" title="gevent.GreenletExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">GreenletExit</span></code></a> will be raised.</p> <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">gevent</span> <span class="kn">import</span> <span class="n">Greenlet</span> <span class="gp">>>> </span><span class="n">g</span> <span class="o">=</span> <span class="n">Greenlet</span><span class="p">(</span><span class="n">gevent</span><span class="o">.</span><span class="n">sleep</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="gp">>>> </span><span class="n">g</span><span class="o">.</span><span class="n">start</span><span class="p">()</span> <span class="gp">>>> </span><span class="n">g</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span> <span class="gp">>>> </span><span class="n">g</span><span class="o">.</span><span class="n">dead</span> <span class="go">True</span> </pre></div> </div> <p>The <a class="reference internal" href="api/gevent.greenlet.html#gevent.GreenletExit" title="gevent.GreenletExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">GreenletExit</span></code></a> exception and its subclasses are handled differently than other exceptions. Raising <a class="reference internal" href="api/gevent.greenlet.html#gevent.GreenletExit" title="gevent.GreenletExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">GreenletExit</span></code></a> is not considered an exceptional situation, so the traceback is not printed. The <a class="reference internal" href="api/gevent.greenlet.html#gevent.GreenletExit" title="gevent.GreenletExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">GreenletExit</span></code></a> is returned by <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.get" title="gevent.Greenlet.get"><code class="xref py py-meth docutils literal notranslate"><span class="pre">get</span></code></a> as if it were returned by the greenlet, not raised.</p> <p>The <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.kill" title="gevent.Greenlet.kill"><code class="xref py py-meth docutils literal notranslate"><span class="pre">kill</span></code></a> method can accept a custom exception to be raised:</p> <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">g</span> <span class="o">=</span> <span class="n">Greenlet</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">gevent</span><span class="o">.</span><span class="n">sleep</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> <span class="c1"># spawn() creates a Greenlet and starts it</span> <span class="gp">>>> </span><span class="n">g</span><span class="o">.</span><span class="n">kill</span><span class="p">(</span><span class="ne">Exception</span><span class="p">(</span><span class="s2">"A time to kill"</span><span class="p">))</span> <span class="gt">Traceback (most recent call last):</span> <span class="w"> </span><span class="c">...</span> <span class="gr">Exception</span>: <span class="n">A time to kill</span> <span class="x">Greenlet(5) failed with Exception</span> </pre></div> </div> <p>The <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.kill" title="gevent.Greenlet.kill"><code class="xref py py-meth docutils literal notranslate"><span class="pre">kill</span></code></a> can also accept a <em>timeout</em> argument specifying the number of seconds to wait for the greenlet to exit. Note that <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.kill" title="gevent.Greenlet.kill"><code class="xref py py-meth docutils literal notranslate"><span class="pre">kill</span></code></a> cannot guarantee that the target greenlet will not ignore the exception (i.e., it might catch it), thus it’s a good idea always to pass a timeout to <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.kill" title="gevent.Greenlet.kill"><code class="xref py py-meth docutils literal notranslate"><span class="pre">kill</span></code></a> (otherwise, the greenlet doing the killing will remain blocked forever).</p> <div class="admonition tip"> <p class="admonition-title">Tip</p> <p>The exact timing at which an exception is raised within a target greenlet as the result of <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.kill" title="gevent.Greenlet.kill"><code class="xref py py-meth docutils literal notranslate"><span class="pre">kill</span></code></a> is not defined. See that function’s documentation for more details.</p> </div> <div class="admonition caution"> <p class="admonition-title">Caution</p> <p>Use care when killing greenlets, especially arbitrary greenlets spawned by a library or otherwise executing code you are not familiar with. If the code being executed is not prepared to deal with exceptions, object state may be corrupted. For example, if it has acquired a <code class="docutils literal notranslate"><span class="pre">Lock</span></code> but <em>does not</em> use a <code class="docutils literal notranslate"><span class="pre">finally</span></code> block to release it, killing the greenlet at the wrong time could result in the lock being permanently locked:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">func</span><span class="p">():</span> <span class="c1"># DON'T DO THIS</span> <span class="n">lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="n">socket</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="c1"># This could raise many exceptions, including GreenletExit</span> <span class="n">lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span> </pre></div> </div> <p><a class="reference external" href="http://docs.oracle.com/javase/8/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html">This document</a> describes a similar situation for threads.</p> </div> <p>Greenlets also function as context managers, so you can combine spawning and waiting for a greenlet to finish in a single line:</p> <div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">in_greenlet</span><span class="p">():</span> <span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"In the greenlet"</span><span class="p">)</span> <span class="gp">... </span> <span class="k">return</span> <span class="mi">42</span> <span class="gp">>>> </span><span class="k">with</span> <span class="n">Greenlet</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">in_greenlet</span><span class="p">)</span> <span class="k">as</span> <span class="n">g</span><span class="p">:</span> <span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"In the with suite"</span><span class="p">)</span> <span class="go">In the with suite</span> <span class="go">In the greenlet</span> <span class="gp">>>> </span><span class="n">g</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">block</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="go">42</span> </pre></div> </div> </section> <section id="timeouts"> <h2>Timeouts<a class="headerlink" href="#timeouts" title="Link to this heading">¶</a></h2> <p>Many functions in the gevent API are synchronous, blocking the current greenlet until the operation is done. For example, <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.kill" title="gevent.Greenlet.kill"><code class="xref py py-meth docutils literal notranslate"><span class="pre">kill</span></code></a> waits until the target greenlet is <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.dead" title="gevent.Greenlet.dead"><code class="xref py py-attr docutils literal notranslate"><span class="pre">dead</span></code></a> before returning <a class="footnote-reference brackets" href="#f1" id="id2" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>. Many of those functions can be made asynchronous by passing the keyword argument <code class="docutils literal notranslate"><span class="pre">block=False</span></code>.</p> <p>Furthermore, many of the synchronous functions accept a <em>timeout</em> argument, which specifies a limit on how long the function can block (examples include <a class="reference internal" href="api/gevent.event.html#gevent.event.Event.wait" title="gevent.event.Event.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">gevent.event.Event.wait()</span></code></a>, <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.join" title="gevent.Greenlet.join"><code class="xref py py-meth docutils literal notranslate"><span class="pre">gevent.Greenlet.join()</span></code></a>, <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.kill" title="gevent.Greenlet.kill"><code class="xref py py-meth docutils literal notranslate"><span class="pre">gevent.Greenlet.kill()</span></code></a>, <a class="reference internal" href="api/gevent.event.html#gevent.event.AsyncResult.get" title="gevent.event.AsyncResult.get"><code class="xref py py-meth docutils literal notranslate"><span class="pre">gevent.event.AsyncResult.get()</span></code></a>, and many more).</p> <p>The <a class="reference internal" href="api/gevent.socket.html#gevent.socket.socket" title="gevent.socket.socket"><code class="xref py py-class docutils literal notranslate"><span class="pre">socket</span></code></a> and <a class="reference internal" href="api/gevent.ssl.html#gevent.ssl.SSLObject" title="gevent.ssl.SSLObject"><code class="xref py py-class docutils literal notranslate"><span class="pre">SSLObject</span></code></a> instances can also have a timeout, set by the <a class="reference external" href="https://docs.python.org/3/library/socket.html#socket.socket.settimeout" title="(in Python v3.13)"><code class="xref py py-meth docutils literal notranslate"><span class="pre">settimeout</span></code></a> method.</p> <p>When these are not enough, the <a class="reference internal" href="api/gevent.timeout.html#gevent.Timeout" title="gevent.Timeout"><code class="xref py py-class docutils literal notranslate"><span class="pre">gevent.Timeout</span></code></a> class and <a class="reference internal" href="api/gevent.html#gevent.with_timeout" title="gevent.with_timeout"><code class="xref py py-func docutils literal notranslate"><span class="pre">gevent.with_timeout()</span></code></a> can be used to add timeouts to arbitrary sections of (cooperative, yielding) code.</p> </section> <section id="further-reading"> <h2>Further Reading<a class="headerlink" href="#further-reading" title="Link to this heading">¶</a></h2> <p>To limit concurrency, use the <a class="reference internal" href="api/gevent.pool.html#gevent.pool.Pool" title="gevent.pool.Pool"><code class="xref py py-class docutils literal notranslate"><span class="pre">gevent.pool.Pool</span></code></a> class (see <a class="reference internal" href="examples/dns_mass_resolve.html"><span class="doc">Example dns_mass_resolve.py</span></a>).</p> <p>Gevent comes with TCP/SSL/HTTP/WSGI servers. See <a class="reference internal" href="servers.html"><span class="doc">Implementing servers</span></a>.</p> <p>There are a number of configuration options for gevent. See <a class="reference internal" href="configuration.html#gevent-configuration"><span class="std std-ref">Configuring gevent</span></a> for details. This document also explains how to enable gevent’s builtin monitoring and debugging features.</p> <p>The objects in <a class="reference internal" href="api/gevent.util.html#module-gevent.util" title="gevent.util"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent.util</span></code></a> may be helpful for monitoring and debugging purposes.</p> <p>See <a class="reference internal" href="api/index.html"><span class="doc">API reference</span></a> for a complete API reference.</p> </section> <section id="external-resources"> <h2>External resources<a class="headerlink" href="#external-resources" title="Link to this heading">¶</a></h2> <p><a class="reference external" href="http://sdiehl.github.io/gevent-tutorial/">Gevent for working Python developer</a> is a comprehensive tutorial.</p> <p class="rubric">Footnotes</p> <aside class="footnote-list brackets"> <aside class="footnote brackets" id="f1" role="doc-footnote"> <span class="label"><span class="fn-bracket">[</span><a role="doc-backlink" href="#id2">1</a><span class="fn-bracket">]</span></span> <p>This was not the case before 0.13.0, <a class="reference internal" href="api/gevent.greenlet.html#gevent.Greenlet.kill" title="gevent.Greenlet.kill"><code class="xref py py-meth docutils literal notranslate"><span class="pre">kill</span></code></a> method in 0.12.2 and older was asynchronous by default.</p> </aside> </aside> </section> </section> </article> </div> <footer> <div class="related-pages"> <a class="next-page" href="api/gevent.html"> <div class="page-info"> <div class="context"> <span>Next</span> </div> <div class="title"><code class="xref py py-mod docutils literal notranslate"><span class="pre">gevent</span></code> – common functions</div> </div> <svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg> </a> <a class="prev-page" href="changelog_pre.html"> <svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg> <div class="page-info"> <div class="context"> <span>Previous</span> </div> <div class="title">Changes before gevent 1.0</div> </div> </a> </div> <div class="bottom-of-page"> <div class="left-details"> <div class="copyright"> Copyright © 2009-2023, gevent contributors </div> Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s <a href="https://github.com/pradyunsg/furo">Furo</a> </div> <div class="right-details"> </div> </div> </footer> </div> <aside class="toc-drawer"> <div class="toc-sticky toc-scroll"> <div class="toc-title-container"> <span class="toc-title"> On this page </span> </div> <div class="toc-tree-container"> <div class="toc-tree"> <ul> <li><a class="reference internal" href="#">Introduction</a><ul> <li><a class="reference internal" href="#example">Example</a></li> <li><a class="reference internal" href="#monkey-patching">Monkey patching</a><ul> <li><a class="reference internal" href="#beyond-sockets">Beyond sockets</a></li> </ul> </li> <li><a class="reference internal" href="#event-loop">Event loop</a></li> <li><a class="reference internal" href="#cooperative-multitasking">Cooperative multitasking</a></li> <li><a class="reference internal" href="#lightweight-pseudothreads">Lightweight pseudothreads</a></li> <li><a class="reference internal" href="#timeouts">Timeouts</a></li> <li><a class="reference internal" href="#further-reading">Further Reading</a></li> <li><a class="reference internal" href="#external-resources">External resources</a></li> </ul> </li> </ul> </div> </div> </div> </aside> </div> </div><script src="_static/documentation_options.js?v=32fdf4fc"></script> <script src="_static/doctools.js?v=9bcbadda"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script src="_static/scripts/furo.js?v=5fa4622c"></script> </body> </html>