Как определить, активен ли Gevent monkey-patching?

У меня есть unittest на Python, который зависит от multiprocessing и поэтому не должен запускаться, когда Gentent-обезьяна-патч активен. Есть ли инструкция Python, которая может сказать мне, запущен ли gevent.monkey.patch_all?

Ответ 1

Я не уверен, что есть идиоматический способ, но один простой способ - проверить класс socket.socket:

import gevent.monkey, gevent.socket
gevent.monkey.patch_all()
import socket

if socket.socket is gevent.socket.socket:
    print "gevent monkey patch has occurred"

Ответ 2

afaik gevent.monkey.saved dict обновляется только тогда, когда элемент исправлен, а оригинал помещается внутри dict (и удаляется при распаковке), например

>>> from gevent.monkey import saved
>>> 'sys' in saved
True

Ответ 3

Здесь то, что я использовал для определения того, активен ли патч gevent monkey.

def is_gevent_monkey_patched():
    try:
        from gevent import monkey
    except ImportError:
        return False
    else:
        return bool(monkey.saved)

Как A. Jesse Jiryu Davis, это работает только для gevent 1.0.x.

Обновлено: в gevent 1.1 там API поддержки, который полезен для того, чтобы узнать, были ли объекты заражены обезьяной. Таким образом, ответ для gevent 1.1 может быть:

def is_gevent_monkey_patched():
    try:
        from gevent import monkey
    except ImportError:
        return False
    else:
        return monkey.is_module_patched('__builtin__')

Кстати, я обнаружил, что monkey.is_module_patched('sys') всегда возвращает False. Изучив monkey.saved.keys() после запуска monkey.patch_all(), я думаю, что для проверки доступны только следующие модули:

['_threading_local', '_gevent_saved_patch_all', 'socket', 'thread', 'ssl', 
 'signal', '__builtin__', 'subprocess', 'threading', 'time', 'os', 'select']