Gevent

PyMongo supports Gevent. Simply call Gevent’s monkey.patch_all() before loading any other modules:

  1. >>> # You must call patch_all() *before* importing any other modules
  2. >>> from gevent import monkey
  3. >>> _ = monkey.patch_all()
  4. >>> from pymongo import MongoClient
  5. >>> client = MongoClient()

PyMongo uses thread and socket functions from the Python standard library. Gevent’s monkey-patching replaces those standard functions so that PyMongo does asynchronous I/O with non-blocking sockets, and schedules operations on greenlets instead of threads.

Avoid blocking in Hub.join

By default, PyMongo uses threads to discover and monitor your servers’ topology (see Health Monitoring). If you execute monkey.patch_all() when your application first begins, PyMongo automatically uses greenlets instead of threads.

When shutting down, if your application calls join() on Gevent’s Hub without first terminating these background greenlets, the call to join() blocks indefinitely. You therefore must close or dereference any active MongoClient before exiting.

An example solution to this issue in some application frameworks is a signal handler to end background greenlets when your application receives SIGHUP:

  1. import signal
  2. def graceful_reload(signum, traceback):
  3. """Explicitly close some global MongoClient object."""
  4. client.close()
  5. signal.signal(signal.SIGHUP, graceful_reload)

Applications using uWSGI prior to 1.9.16 are affected by this issue, or newer uWSGI versions with the -gevent-wait-for-hub option. See the uWSGI changelog for details.