>  기사  >  백엔드 개발  >  고성능 Python 프로그래밍 코루틴(스택리스)

고성능 Python 프로그래밍 코루틴(스택리스)

高洛峰
高洛峰원래의
2016-10-18 10:05:101456검색

우리 모두는 현재 동시(병렬 아님) 프로그래밍, 다중 프로세스, 다중 스레드, 비동기 및 코루틴의 네 가지 방법이 있다는 것을 알고 있습니다.

Python의 다중 프로세스 프로그래밍에는 C와 유사한 os.fork가 있으며 물론 더 높은 수준의 캡슐화된 다중 처리 표준 라이브러리가 있습니다. http://www. cnblogs.com/hymenz/p/3488837.html에서는 nginx의 마스터 프로세스와 작업자 프로세스 간의 신호 처리 방법과 유사한 신호 처리 방법을 제공하여 비즈니스 프로세스의 종료를 기본 프로세스에서 감지할 수 있도록 합니다.

멀티 스레드 프로그래밍 Python에는 스레드와 스레딩이 있습니다. Linux에서 소위 스레드는 실제로 LWP 경량 프로세스로, LWP, COW의 프로세스와 동일한 스케줄링 방법을 갖습니다. write fork, vfork, clone 등에 대해서는 더 많은 정보가 있으므로 여기서는 자세히 다루지 않겠습니다.

Linux에는 select, poll, epoll이라는 세 가지 주요 비동기 구현이 있습니다. 이 기사에서는 비동기식에 중점을 두지 않습니다.

코루틴에 관해 이야기할 때 먼저 Yield에 대해 이야기해야 합니다. 먼저 예를 살펴보겠습니다.

#coding=utf-8
import time
import sys
# 生产者
def produce(l):
    i=0
    while 1:
        if i < 5:
            l.append(i)
            yield i
            i=i+1
            time.sleep(1)
        else:
            return
      
# 消费者
def consume(l):
    p = produce(l)
    while 1:
        try:
            p.next()
            while len(l) > 0:
                print l.pop()
        except StopIteration:
            sys.exit(0)
l = []
consume(l)

위의 예에서 프로그램이 생산물의 Yield i를 실행할 때 생성기는 다음과 같습니다. 반환됨, 사용자 정의에서 p.next()를 호출하면 프로그램은 실행을 계속하기 위해 생산물 i를 반환하여 요소가 l에 추가되도록 한 다음 p.next()가 StopIteration을 트리거할 때까지 l.pop()을 인쇄합니다. 이상.

위의 예를 통해 코루틴의 스케줄링이 커널에 보이지 않고, 코루틴이 공동으로 스케줄링되는 것을 볼 수 있습니다. 이로 인해 동시성 수가 수만 개 이상일 때 코루틴의 성능이 훨씬 저하됩니다. 스레드보다.

import stackless
import urllib2
def output():
    while 1:
        url=chan.receive()
        print url
        f=urllib2.urlopen(url)
        #print f.read()
        print stackless.getcurrent()
     
def input():
    f=open(&#39;url.txt&#39;)
    l=f.readlines()
    for i in l:
        chan.send(i)
chan=stackless.channel()
[stackless.tasklet(output)() for i in xrange(10)]
stackless.tasklet(input)()
stackless.run()

코루틴에 대해서는 greenlet, stackless, gevent, eventlet 등의 구현을 참고할 수 있습니다.

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