monkey patch all
1. 어느 위치에 써줘야할까?
문서에 보면 가능한 젤 위에 patch all코드를 쓰라고한다. 근데 상식적으로, import 모듈을 해놓고 패치를 해야 로드된걸 패치시키는게 아닐까? 라는 의문을 같게 된다.
대답은 맞다. 그렇지만 맨위에 쓰는게 맞다 이다.
왜냐면, monkey patch 를 지원하는 standard library들은 순서가 어찌되었건 몽키패치를 지원한다.
from gevent.monkey import is_module_patched
from gevent import monkey;monkey.patch_all()
import socket
import threading
print(is_module_patched("socket"))
print(is_module_patched("threading"))
결과:
True
Ture
import socket
import threading
from gevent import monkey;monkey.patch_all()
print(is_module_patched("socket"))
print(is_module_patched("threading"))
결과:
True
True
그렇지만 몽키패치를 지원하지 않는 3rd library들은 위험할수도 있기 때문에 가급적 패치올을 맨위에 써서 영향이 안가도록 맨위에 쓰라는 것이다.
2. patch_all(thread=False)
thread patch는 기본적으로 True다. thread가 몽키패치되게되면, threading을 쓰는 부분을 thread가 아니라 gevent에서 지원하는 Greenlet object로 바뀌게된다.
일단 큰 차이는 context switching 시점이다.
thread는 내가 원하는 시점에 명시적으로 context switching을 하는게 아니라 os 스케줄에 따라서 context switching이 되어 쓸데없는 비용을 소비하게 될 확률이 높다.
그러나 greenlet object는 명시적 sleep이나 library의 io에 패치된 경우에 한해서 context switching이 된다.
참고로, windows 10에서는 maximum recursive error가 나오면서 patch_all 함수가 실패한다. 이때 thread=False 옵션을주면 잘 동작하게 된다. 아마 윈도우10에서는 thread패치를 완벽히 지원하지 않는것 같다.
reference
1. https://stackoverflow.com/questions/39537004/gevent-monkey-patching-order
2. https://stackoverflow.com/questions/15556718/greenlet-vs-threads
'python' 카테고리의 다른 글
flask save session error (0) | 2017.12.05 |
---|---|
python3 flask + pymongo + gevent, locust testing hangs (0) | 2017.09.26 |
flask with gevent monkey patch all (0) | 2017.07.26 |
flask gevent spawn use a lot of memory (0) | 2017.04.05 |
websocket with gunicorn (0) | 2017.03.03 |