123 염기 코 루틴

첫째, 스레드, 검토를 처리

  1. 오퍼레이팅 시스템 프로세스가 자원 할당의 최소 단위이며, 상기 나사는 최소 단위의 CPU 스케줄링이다.

  2. 동시 자연 : 보존 상태 전환 +.

  3. 작업을 실행하는 CPU가, 두 경우 (강제 전환이 운영 체제에 의해 제어되는)에서 절단 주위 방해물이 작업을 발생하는 경우를 다른 작업을 수행 할 다른 태스크는 계산 시간이 너무 길다는 것이다.

  4. 처리 이론을 도입하는 방법의 세 가지 실시 상태를 언급하고,이 세 가지 상태도 스레드로 이해 될 수 있도록 스레드는 실행 유닛이다.

  5. 비가 CPU가 모든 작업을 달성 할 수있을 내려 단지 수 있도록, 효율성을 강화하지 않는 동시 다중 작업은 순수 계산하지만,이 스위치의 효율성을 줄일 경우, 결과의 "동시"구현이 될 것으로 보인다.

둘째, 공동 생산 공정

코 루틴 : 동시 단일 스레드라고도 마이크로 스레드, 분쇄기. 영어 코 루틴.

무엇이 워드 설명 코 루틴이다 : 코 루틴 경량 스레드, 즉 코 루틴은 자신을 스케쥴링 사용자 프로그램 동시성 단일 스레드에 의해 제어되어, 사용자의 상태이다.

그것은 강조한다 :

  1. 커널 레벨에 속하는 파이썬 스레드, 즉 상기 운영 시스템 스케줄러에 의해 제어되는 (단일 스레드 실행 시간이 너무 길거나 발생 등의 입출력은, CPU가 실행 권한을 넘겨 다른 스레드의 실행으로 전환해야만한다)
  2. 단일 스레드 내에 열기 코 루틴 이벤트 IO 윌 (비 독립 핸드 오버 효율 !!! IO 동작) 애플리케이션 레벨 (운영 체제가 아닌) 제어 스위치에서, 효율을 향상시키기 위해서

비교 OS 관리 스레드 스위칭은 사용자 스위치는 단일 스레드 내에 제어 코 루틴.

: 그것은 전환에 왔을 때 IO 의미가 있습니다

특히 : 코 루틴 개념은 본질적으로 프로그래머로부터 추출되고, 코 루틴 존재를 모르는 운영 체제, 내 자신의 경험의 스레드 내 자신의 자신의 다른 작업에 직접 잘라 스레드 및 운영 안에 io를 말할 것이다 이 시스템을 찾을 수 없습니다로, 즉, 단일 스레드에서 가장 높은 효율을 달성한다.

장점 :

  1. 코 루틴 스위칭 오버 헤드 운영체제 이하, 프로그램 레벨 스위칭 부 완전히 눈에 보이지 않는, 따라서 경량이다
  2. 당신은 최대 단일 스레드 CPU의 동시 사용의 효과를 얻을 수 있습니다

단점 :

  1. 자연 코 루틴은 막힘이있을 때마다, 당신은 모든 입출력을 감지 할 수 있고, 멀티 코어가 사용할 수없는 프로그램이 더 개방 과정, 각 프로세스 내에서 열린 여러 스레드 각 스레드에 열려 코 루틴 수 있습니다 단일 스레드입니다 전반적으로 방해했다.
  2. 코 루틴 차단이 발생하면 단일 스레드 코 루틴을 참조하면, 그 후, 어떠한 전환 작업은 전체 스레드를 차단하는 것

특징 :

  1. 그것은 단지 하나의 스레드에서 동시에 구현해야합니다
  2. 잠금없이 공유 데이터를 수정
  3. 사용자 프로그램 제어 흐름 스택 여러 컨텍스트를 저장
import time
def eat():
    print('eat 1')
    # 疯狂的计算呢没有io
    time.sleep(2)
    # for i in range(100000000):
    #     i+1
def play():
    print('play 1')
    # 疯狂的计算呢没有io
    time.sleep(3)
    # for i in range(100000000):
    #     i+1
play()
eat() # 5s

코 루틴 수율을 구현하는 단일 스레드, 사용, 이것은의 Ctrip의 이치 (우리는 경우에 할 수있는 코 루틴을 말했기 때문에 IO는 의미가있다) 없다

import time
def func1():
    while True:
        1000000+1
        yield

def func2():
    g = func1()
    for i in range(100000000):
        i+1
        next(g)

start = time.time()
func2()
stop = time.time()
print(stop - start) # 17.68560242652893

위의 비교는 시간을 실행으로 전환 yeild, 그러나 우리는 혼자 너무의 Ctrip 위는 이해가되지 않습니다 달성하기 위해 더 많은 시간이 소요되는 일련의 실행 기능을보다.

import time

def func1():
    for i in range(100000000):
        i+1
def func2():
    for i in range(100000000):
        i+1

start = time.time()
func1()
func2()
stop = time.time()
print(stop - start) # 12.08229374885559

코 루틴의 셋째, 성격

이 코 루틴의 성질에 사용자 자신의 작업에 의해 제어 만남 단일 나사 결합 IO 효율을 개선하기 위해, 수행 할 다른 작업으로 전환 막았다. 그것을 달성하기 위해, 우리는 같은 시간에 다음과 같은 기준을 충족하는 방법 솔루션을 찾을 필요가 :

  1. 당신은 작업의 복수의 스위칭을 제어 할 수, 작업의 핸드 오버 상태에 앞서 다시 실행하는 것이, 일시 정지의 위치에 따라 계속 할 수 있도록 저장됩니다.
  2. 부록 1 : IO 동작을 감지 할 수는, 전환은 경우에 발생하는 위치의 조작면 IO

3.1 코 루틴은 우리가 genvent 모듈을 사용할 필요가

키 : 코 루틴을 구현하기 위해 사용 gevent이 가능하지만, 우리는 코 루틴 주요 IO는 의미가 경험하고 있지만, 그냥이 gevent 모듈 코 루틴 진정한 의미를 할 수 없다고 그가 동안이 모듈 탐지 IO

但用gevent模块是检测不到IO的,也就是说这样写同样是没有意义的

에서 다음 절차 gevent는 클래스이다

  1. gevent.spawn 성격은 정적 방법 gevent.greenlet.Greenlet 클래스를 생성 호출

    @classmethod
    def spawn(cls, *args, **kwargs):
        g = cls(*args, **kwargs)
        g.start()
        return g
  2. 이 클래스 메소드 호출 Greenlet * __ 초기화 _ * _ 및 가장 중요한에 초기화 기능을 시작, 두 함수 클래스를 코드입니다 : 

    def __init__(self, run=None, *args, **kwargs):
       greenlet.__init__(self, None, get_hub()) # 将新创生的greenlet实例的parent一律设置成hub
       if run is not None:
       self._run = run
# 在这段程序我们发现,这段程序并没有实现遇见IO的时候,用户模cpu实现任务切换
import gevent
import time

def eat():
    print('eat 1')
    time.sleep(2)
    print('eat 2')
def play():
    print('play 1')
    # 疯狂的计算呢没有io
    time.sleep(3)
    print('play 2')

start = time.time()
g1 = gevent.spawn(eat)
g2 = gevent.spawn(play)
g1.join()
g2.join()
end = time.time()
print(end-start) 5.0041022300720215

'''
结果:
eat 1
eat 2
play 1
play 2
5.004306077957153
'''

두 키 : gevent별로 진정으로 의미있는 코 루틴을 달성하기 위해, 달성하는 패치의 gevent를 사용하여 운영 체제에서 사용자의 진정한 실현은 작업의 실현 사이에 앞뒤로 전환 발생했습니다 때 IO를 시뮬레이션 할 수있는 방법을 찾을 수 없습니다

참고 : 여기서 다시, 중요한 의미 코 루틴입니다 상태 Gache 변화를 저장하는 단일 스레드 작업을 달성 , 실제 코 루틴을 수행해야 IO의 경우 충족

from gevent import monkey;monkey.patch_all()
import gevent
import time

def eat():
    print('eat 1')
    time.sleep(2)
    print('eat 2')
def play():
    print('play 1')
    # 疯狂的计算呢没有io
    time.sleep(3)
    print('play 2')

start = time.time()
g1 = gevent.spawn(eat)
g2 = gevent.spawn(play)
g1.join()
g2.join()
end = time.time()
print(end-start)# 3.003168821334839

'''
结果:
eat 1
play 1
eat 2
play 2
3.003168821334839
'''

추천

출처www.cnblogs.com/xichenHome/p/11569119.html