Top Related Projects
Lightweight in-process concurrent programming
Concurrent networking library for Python
Asynchronous HTTP client/server framework for asyncio and Python
Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.
Cross-platform asynchronous I/O
Good Curio!
Quick Overview
Gevent is a concurrent networking library for Python that uses greenlets to provide a high-level synchronous API on top of the libev or libuv event loop. It allows you to write concurrent code using familiar synchronous programming patterns, making it easier to develop and maintain scalable network applications.
Pros
- Easy to use: Gevent provides a familiar synchronous programming model, making it easier for developers to write concurrent code.
- High performance: It leverages greenlets and event loops to achieve efficient concurrency without the complexity of traditional threading.
- Compatibility: Gevent can often be used as a drop-in replacement for Python's standard library, allowing existing code to benefit from concurrency with minimal changes.
- Extensive ecosystem: It offers patched versions of many popular libraries, enabling them to work seamlessly with gevent.
Cons
- Global interpreter lock (GIL): Like standard Python, gevent is still subject to the GIL, which can limit performance in CPU-bound tasks.
- Debugging challenges: Debugging gevent applications can be more difficult due to its use of greenlets and monkey-patching.
- Learning curve: While easier than some alternatives, understanding gevent's concepts and best practices still requires some effort.
Code Examples
- Basic HTTP server:
from gevent.pywsgi import WSGIServer
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b"<b>Hello World!</b>"]
http_server = WSGIServer(('', 8000), application)
http_server.serve_forever()
- Concurrent URL fetching:
import gevent
from gevent import monkey
from urllib.request import urlopen
monkey.patch_all()
urls = ['http://www.google.com', 'http://www.example.com', 'http://www.python.org']
def fetch(url):
print(f'Fetching {url}')
data = urlopen(url).read()
print(f'{url}: {len(data)} bytes')
jobs = [gevent.spawn(fetch, url) for url in urls]
gevent.joinall(jobs)
- Gevent-based socket server:
from gevent.server import StreamServer
def handle(socket, address):
print(f'New connection from {address}')
socket.sendall(b'Welcome to the echo server! Type quit to exit.\n')
while True:
data = socket.recv(1024)
if not data:
break
if data.strip().lower() == b'quit':
socket.sendall(b'Goodbye!\n')
break
socket.sendall(data)
socket.close()
server = StreamServer(('0.0.0.0', 6000), handle)
server.serve_forever()
Getting Started
To get started with gevent:
-
Install gevent:
pip install gevent
-
Import gevent and monkey-patch the standard library:
from gevent import monkey monkey.patch_all()
-
Use gevent's concurrency primitives like
gevent.spawn()
andgevent.joinall()
to create and manage greenlets:import gevent def foo(): print('Running in foo') gevent.sleep(0) print('Explicit context switch to foo again') def bar(): print('Explicit context to bar') gevent.sleep(0) print('Implicit context switch back to bar') gevent.joinall([ gevent.spawn(foo), gevent.spawn(bar), ])
This basic setup allows you to start writing concurrent code using gevent's API.
Competitor Comparisons
Lightweight in-process concurrent programming
Pros of greenlet
- Lightweight and low-level, providing more control over concurrency
- Can be used as a building block for higher-level concurrency frameworks
- Simpler API, easier to understand and use for basic concurrency tasks
Cons of greenlet
- Lacks built-in I/O operations and networking support
- Requires more manual management of cooperative multitasking
- Limited functionality compared to more comprehensive frameworks
Code Comparison
greenlet:
from greenlet import greenlet
def test1():
print("Test 1 start")
gr2.switch()
print("Test 1 end")
def test2():
print("Test 2")
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
gevent:
import gevent
def foo():
print("Running in foo")
gevent.sleep(0)
print("Explicit context switch to foo again")
def bar():
print("Explicit context to bar")
gevent.sleep(0)
print("Implicit context switch back to bar")
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
greenlet provides a lower-level API for managing cooperative multitasking, while gevent offers a higher-level abstraction with built-in support for I/O operations and networking. gevent is built on top of greenlet, extending its functionality and providing a more comprehensive concurrency framework.
Concurrent networking library for Python
Pros of eventlet
- Simpler API and easier to use for beginners
- Better support for Python 3 asyncio integration
- More extensive documentation and examples
Cons of eventlet
- Generally slower performance compared to gevent
- Less active development and community support
- Fewer third-party library patches available
Code Comparison
eventlet:
import eventlet
def fetch(url):
return eventlet.urllib.request.urlopen(url).read()
pool = eventlet.GreenPool(100)
urls = ["http://example.com"] * 1000
for body in pool.imap(fetch, urls):
print("Got body", len(body))
gevent:
import gevent
from gevent import monkey
monkey.patch_all()
def fetch(url):
return urllib.request.urlopen(url).read()
urls = ["http://example.com"] * 1000
jobs = [gevent.spawn(fetch, url) for url in urls]
gevent.joinall(jobs)
Both libraries provide similar functionality for concurrent network operations, but gevent requires explicit patching of standard library modules. eventlet's API is generally considered more intuitive, while gevent offers better performance in most scenarios.
Asynchronous HTTP client/server framework for asyncio and Python
Pros of aiohttp
- Built on top of Python's native asyncio, providing a more Pythonic and standardized approach to asynchronous programming
- Offers both client and server implementations, making it versatile for various use cases
- Actively maintained with frequent updates and a large community
Cons of aiohttp
- Steeper learning curve for developers not familiar with asyncio
- Limited compatibility with synchronous code, requiring careful integration
Code Comparison
aiohttp:
async with aiohttp.ClientSession() as session:
async with session.get('http://example.com') as response:
html = await response.text()
gevent:
import gevent.monkey
gevent.monkey.patch_all()
import requests
response = requests.get('http://example.com')
html = response.text
Key Differences
- aiohttp uses Python's native asyncio, while gevent uses greenlets and monkey-patching
- aiohttp requires explicit async/await syntax, whereas gevent allows for more traditional synchronous-style code
- gevent can work with existing synchronous libraries more easily, but aiohttp offers better performance for purely asynchronous workloads
Both libraries are powerful tools for concurrent programming in Python, with aiohttp being more modern and standardized, while gevent offers easier integration with existing codebases.
Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.
Pros of Tornado
- Native asynchronous programming model with coroutines
- Built-in web framework with routing and templating
- Better performance for long-polling and WebSocket connections
Cons of Tornado
- Steeper learning curve for developers new to async programming
- Limited ecosystem compared to gevent's compatibility with synchronous libraries
- May require more explicit code for handling asynchronous operations
Code Comparison
Tornado:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
async def get(self):
await self.write("Hello, World!")
app = tornado.web.Application([(r"/", MainHandler)])
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
gevent:
from gevent import monkey; monkey.patch_all()
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, World!"
app.run()
Tornado uses an explicit async/await syntax and provides a built-in web framework. gevent, on the other hand, allows the use of synchronous frameworks like Flask by monkey-patching the standard library, making it easier to work with existing codebases but potentially less performant for certain use cases.
Cross-platform asynchronous I/O
Pros of libuv
- Cross-platform support for asynchronous I/O
- Designed for high performance and low overhead
- Used as the foundation for Node.js, providing a battle-tested codebase
Cons of libuv
- Lower-level API, requiring more manual management
- Steeper learning curve for developers new to asynchronous programming
- Less Pythonic, as it's primarily a C library
Code Comparison
gevent example:
import gevent
def foo():
print('Running in foo')
gevent.sleep(0)
print('Explicit context switch to foo again')
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(foo)
])
libuv example (using PyUV):
import pyuv
def on_timer(timer_handle):
print('Timer callback')
timer_handle.stop()
loop = pyuv.Loop.default_loop()
timer = pyuv.Timer(loop)
timer.start(on_timer, 1.0, 0.0)
loop.run()
Key Differences
- gevent provides a more Pythonic API, while libuv requires bindings like PyUV for Python use
- gevent focuses on cooperative multitasking, while libuv offers a broader range of asynchronous I/O operations
- libuv has wider language support and is used in projects beyond Python, such as Node.js
Good Curio!
Pros of Curio
- Pure Python implementation, making it easier to understand and modify
- Designed specifically for Python 3, leveraging modern language features
- Simpler API with a focus on async/await syntax
Cons of Curio
- Smaller community and ecosystem compared to Gevent
- Less mature and battle-tested in production environments
- May have fewer integrations with existing libraries and frameworks
Code Comparison
Curio example:
import curio
async def hello():
await curio.sleep(1)
print('Hello, World!')
curio.run(hello)
Gevent example:
import gevent
def hello():
gevent.sleep(1)
print('Hello, World!')
gevent.spawn(hello).join()
Both libraries aim to provide concurrency solutions, but Curio focuses on modern Python async/await syntax, while Gevent uses greenlets and monkey-patching. Curio's approach aligns more closely with Python's built-in asyncio library, potentially making it easier for developers familiar with asyncio to adopt. However, Gevent's longer history and larger ecosystem may make it a more attractive option for projects requiring extensive third-party library support or proven scalability in production environments.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
======== gevent
.. image:: https://github.com/gevent/gevent/workflows/gevent%20testing/badge.svg :target: https://github.com/gevent/gevent/actions
.. image:: https://ci.appveyor.com/api/projects/status/bqxl88yhpho223jg?svg=true :target: https://ci.appveyor.com/project/denik/gevent
.. image:: https://coveralls.io/repos/gevent/gevent/badge.svg?branch=master&service=github :target: https://coveralls.io/github/gevent/gevent?branch=master
.. include:: docs/_about.rst
Read the documentation online at http://www.gevent.org.
Post issues on the bug tracker
, discuss and ask open ended
questions on the mailing list
, and find announcements and
information on the blog_ and twitter (@gevent)
_.
.. include:: docs/install.rst
.. _bug tracker: https://github.com/gevent/gevent/issues .. _mailing list: http://groups.google.com/group/gevent .. _blog: https://dev.nextthought.com/blog/categories/gevent.html .. _twitter (@gevent): http://twitter.com/gevent
Top Related Projects
Lightweight in-process concurrent programming
Concurrent networking library for Python
Asynchronous HTTP client/server framework for asyncio and Python
Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.
Cross-platform asynchronous I/O
Good Curio!
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot