우리 모두는 현재 동시(병렬 아님) 프로그래밍, 다중 프로세스, 다중 스레드, 비동기 및 코루틴의 네 가지 방법이 있다는 것을 알고 있습니다.
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('url.txt') 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 등의 구현을 참고할 수 있습니다.