2012-04-18 6 views
2

이벤트 루프 (예 : NodeJS)에서 차단 코드가 잘못되었다고 생각하지만 greenlets (녹색 스레드라고 생각하는)는 어떨까요? 차단 기능을 호출하는 코드를 실행하는 데 문제가 있습니까?미성년자 문제를 차단하고 있습니까?

답변

5

very primitive입니다 gevent에 의해 제공되는 이벤트 루프없이 자신을 Greenlets. 미성년자 만이 입출력 작업 및 스케쥴러에서 산출 할 수있는 기능이 없으므로 하나의 미성년자로부터 차단 호출은 모든 미성년자를 차단합니다. Gevent의 소켓 및 파일 IO에 대한 원숭이 패치는 일반적으로 데이터베이스 라이브러리가 파이썬으로 작성되고 소켓을 사용한다는 조건으로 데이터베이스와 함께 비 차단 IO를 활성화하는 데 충분합니다. 또는 직접 라이브러리를 패치 할 수도 있습니다.

+0

귀하의 예제는 죽은 링크입니다. 고쳐 주시겠습니까? 감사! – dionyziz

+2

팔로 인한 다운 투표가 확실하지 않지만 괜찮습니다. – philofinfinitejest

3

다른 녹색 스레드가이 기능의 끝을 기다리고 있기 때문에 이벤트 루프를 차단하는 호출 기능은 물론 문제입니다.
그러나 Gevent을 사용하는 경우 차단 기능을 호출 할 수 있습니다. Gevent는 일반적인 파이썬 차단 기능을 패치합니다. 프로그램의 시작 부분이 쓰기 Gevent 모두 차단 기능을 패치합니다 :

 
from gevent import monkey 
monkey.patch_all() 
+0

녹색 스레드가 이벤트 루프와 같은 것이 아니라는 느낌이 들었습니다. 다른 모든 요청이 처리되는 것을 방지하기 때문에 이벤트 루프에서 코드를 호출하는 것이 문제가됩니다. 미성년자를 사용할 때 차단 코드를 호출하는 것이 데이터베이스 호출을 차단하는 것과 같은 문제인지 여부는 확실하지 않았습니다. 지렁이 원숭이 패치는 네트워킹 기능 만 차단합니다. – Matty

+0

데이터베이스가 다릅니다. 1) 느린 db 요청과 동시 요청은 일반적으로 느립니다. 데이터베이스 처리량은 연결 수에 따라 곧 감소 할 수 있습니다. 2) 나쁨 또는 느린 네트워크 서버가 다른 빠른 서버에 대한 요청을 차단해서는 안됩니다. 네트워크 병렬 처리는 대개 처리량을 증가시킵니다. – hynekcer

관련 문제