2013-09-04 4 views
2

저는 아직도 greenlets과 gevent에 익숙하지 않지만, 이해하는 것으로부터, greenlets은 명시 적 yield 문이나 블로킹 I/O 작업에서 다른 greenlets에 양보합니다. 하지만 print 문을 사용하여 stdout에 쓰기가 차단되어 있습니까? 로깅 모듈을 사용하여 stdout, stderr 또는 로컬 디스크의 파일이나 NFS에 기록하는 것은 어떻습니까?로깅이나 인쇄 방법으로 그린렛을 전환 할 수 있습니까?

print 문 또는 로깅 방법을 호출하면 녹색 알레르기가 전환 될 수 있습니까?

+0

그린렛 단독으로는 결코 암시 적으로 양보하지 않는다. gevent가 여러 가지 표준 라이브러리 객체를 패치하여 그 효과를 얻는 것이 가능합니다 (그러나 나는 그것을 암시 할 수 없기 때문에 이것은 단지 주석이 될뿐 응답이 아닙니다 :-). –

+1

gevent에는 특정 모듈을 IO 호출을 차단할 때 다른 greenlet에 생성되는 버전으로 대체 할 수있는 원숭이 패치 작업이 있습니다 (예 : gevent.socket). 그런 다음 궁금한 사항은 gevent.monkey.patch_all은 로깅 모듈에서 사용하는 함수를 다른 greenlets에 제공되는 버전으로 바꿉니 까? – iHateCamelCase

답변

1

print 문은 항상 차단되어 있으며 다른 greenlets로 전환하지 않습니다. 모든 Gevent 서버 코드에서 인쇄 지시를 피하십시오.

Newer Gevent 버전에는 비 차단 작업을 위해 로깅 모듈과 함께 사용할 수있는 비동기 파일 I/O gevent.os.tp_read이 있습니다. 이 경우 로그 문을 사용하면 Greenlet 컨텍스트가 전환됩니다.

+0

블로킹 작업으로 인해 다른 그린렛으로 전환되기 때문에 이것은 놀라운 일입니다. – iHateCamelCase

+0

@RelationRelatesItselfToItself 비동기 작업으로 인해 스위치가 발생합니다. 알아내는 가장 쉬운 방법은 실험하는 것입니다. time.sleep()은 패치하지 않고 함수를 차단하고 gevent.sleep()은 비동기 함수입니다. – Alex

+0

좋은 정보! 또한 로깅 모듈을 monkeypatch 할 수없는 경우 get_hub(). threadpool.spawn을 사용하여 로깅 문을 실행할 수 있습니다. 이것은 gevent의 기본 OS 스레드 풀에서 사용자의 기능을 실행합니다. 매우 편리합니다. – jsalter