The psycogreen package enables psycopg2 to work with coroutine libraries, using asynchronous calls internally but offering a blocking interface so that regular code can run unmodified.
Psycopg offers coroutines support since release 2.2. Because the main module is a C extension it cannot be monkey-patched to become coroutine-friendly. Instead it exposes a hook that coroutine libraries can use to install a function integrating with their event scheduler. Psycopg will call the function whenever it executes a libpq call that may block. psycogreen is a collection of "wait callbacks" useful to integrate Psycopg with different coroutine libraries.
The Psycopg 3 module doesn't require psycogreen; psycogreen has no effect on Psycopg 3.
In Psycopg 3:
- gevent is supported automatically from 3.1.14 on. Please avoid to use older versions.
- Eventlet is currently not supported, as the project doesn't seem very active anymore. Support can be added if requested.
- uWsgi is currently in maintenance mode, so Psycopg 3 support doesn't seem necessary.
pip install psycogreen
Eventlet currently supports `psycopg2` out-of-the-box and ``psycogreen
is not necessary. See the documentation for patching instruction.
If for any reason you want to avoid using Eventlet monkeypatching you can use
psycogreen.eventlet.patch_psycopg()
.
- Function
psycogreen.eventlet.patch_psycopg()
- Enable async processing in Psycopg integrated with the Eventlet events
loop. It is performed by registering
eventlet_wait_callback()
as psycopg2 wait callback. - Function
psycogreen.eventlet.eventlet_wait_callback(conn)
- A wait callback integrating with Eventlet events loop.
An example script showing concurrent usage of psycopg2
with urlopen()
with Eventlet is available in tests/test_eventlet.py
.
In order to use psycopg2 asynchronously with gevent you can use
psycogreen.gevent.patch_psycopg()
.
- Function
psycogreen.gevent.patch_psycopg()
- Enable async processing in Psycopg integrated with the gevent events
loop. It is performed by registering
gevent_wait_callback()
as psycopg2 wait callback. - Function
psycogreen.gevent.gevent_wait_callback(conn)
- A wait callback integrating with gevent events loop.
An example script showing concurrent usage of psycopg2
with urlopen()
with gevent is available in tests/test_gevent.py
.
Roberto De Ioris is writing uGreen, a green thread implementation on top of the uWSGI async platform.
He has performed some tests using both psycopg2 async support and psycopg2 green support and has reported no problem in their stress tests with both the async styles.