У меня есть unittest на Python, который зависит от multiprocessing
и поэтому не должен запускаться, когда Gentent-обезьяна-патч активен. Есть ли инструкция Python, которая может сказать мне, запущен ли gevent.monkey.patch_all
?
Как определить, активен ли Gevent monkey-patching?
Ответ 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']