나는 multiprocessing
에 의존하는 파이썬 단위 테스트를 가지고 있기 때문에 Gevent의 원숭이 패치가 활성화되어 있으면 실행하지 않아야합니다. gevent.monkey.patch_all
이 실행되었는지 여부를 알려주는 Python 문이 있습니까?Gevent의 원숭이 패치가 활성화되어 있는지 어떻게 알 수 있습니까?
답변
나는 관용적 방법이 확실하지 않다,하지만 간단한 방법은 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"
gevent.monkey.saved
DICT 만 항목이 패치 때 업데이트하고, 원래되어 AFAIK (예 : unpatching에서 제거 된) 사전 내에 배치됩니다.
>>> from gevent.monkey import saved
>>> 'sys' in saved
True
안녕하세요, Wes! 이것은 좋은 생각이지만, Gevent 1.03에서 "saved"가 나타나는 반면, Gevent 0.13으로 돌아 가기 때문에 다른 대답을 받아 들일 것입니다. –
'monkey.patch_all()'을 실행 한 후에'monkey.saved.keys()'를 살펴보면,''sys "'키가 있다고 생각하지 않습니다. 이것은 원숭이 - 패치를 탐지하는 유효한 방법이 아닙니다. – Rockallite
다음은 geent monkey patching이 활성화되어 있는지 감지하기 위해 사용한 것입니다. 언급 A. Jesse Jiryu Davis으로
def is_gevent_monkey_patched():
try:
from gevent import monkey
except ImportError:
return False
else:
return bool(monkey.saved)
,이 gevent 1.0.x와 만 작동합니다.
gevent 1.1에에 업데이트 됨 : an support 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__')
은 BTW, 나는 monkey.is_module_patched('sys')
항상 False
를 반환 찾을 수 있습니다. monkey.patch_all()
를 실행 한 후 monkey.saved.keys()
로 보면, I는 다음과 같은 모듈이 확인 유효 생각 :
['_threading_local', '_gevent_saved_patch_all', 'socket', 'thread', 'ssl',
'signal', '__builtin__', 'subprocess', 'threading', 'time', 'os', 'select']
고마워, 그거 참 좋았어. –
그냥 약간의 제안을, 더 파이썬 방법은 다음과 같습니다'socket.socket이 –
@WesMason gevent.socket' 경우 고마워, 좋다. 그것은 socket.socket이 gevent.socket.socket 인 경우'해야합니다. – Anorov