>  기사  >  백엔드 개발  >  Python gevent 구현 메커니즘

Python gevent 구현 메커니즘

巴扎黑
巴扎黑원래의
2016-12-09 14:38:401322검색

앞서 살펴본 그린렛은 코루틴의 기본 기능만을 제공하며 가장 작은 실행 단위입니다. 하지만 이를 사용하려면 어떤 그린렛이 언제 실행되어야 하는지 스케줄링하는 스케줄러를 제공해야 합니다. gevent 구현을 보면 현재 안정 버전은 libev.libevent에 대한 대안을 사용합니다. libev는 많은 이벤트 유형을 지원하지만 가장 일반적으로 사용되는 유형은 io 및 타이머 유형입니다. 시스템에서 제공하는 호출(Linux에서는 epoll), 타이머 유형은 최소 힙을 유지하여 구현됩니다.
다음 코드를 보세요:

Python 코드

import gevent  
from gevent import monkey  
monkey.patch_all()  
  
def download():  
    import urllib2  
    urllib2.urlopen('http://www.google.com/').read()  
  
c = gevent.spawn(download)  
gevent.joinall([c])

spawn을 통한 gevent 그린렛의 실행 기능은 다운로드입니다. 이 그린렛을 시작하려면 libev가 이벤트 루프를 실행할 때마다 이 그린렛을 추가합니다. 실행 후 준비 콜백의 함수가 호출됩니다. 이렇게 하면 생성된 각 greenlet이 실행될 수 있습니다.
이 greenlet이 실행될 때. io 작업(socket.[send|recv ])이 포함되므로 gevent는 해당 작업이 호출되면 fd에 해당하는 watcher가 생성되어 libev의 이벤트 목록에 추가됩니다.
관련 읽기 및 쓰기 이벤트가 발생하면 해당 콜백이 greenlet의 스위치를 호출하여 코루틴을 전환합니다.
위 방법을 통해 greenlet은 스케줄러의 목적을 달성합니다. >


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.