python 병발 의 협정

4213 단어 파 이 썬 기반
콘 셉 트
협 정 은 마이크로 스 레 드 라 고도 부른다.영어 이름 Corontine.서브루틴 또는 함수 라 고 부 릅 니 다. 모든 언어 에서 등급 호출 입 니 다. 예 를 들 어 A 호출 B, B 는 실행 과정 에서 C, C 실행 이 끝나 고 돌아 갑 니 다. B 실행 이 끝나 고 돌아 갑 니 다. 마지막 으로 A 실행 이 끝 났 습 니 다.그래서 서브루틴 호출 은 스 택 을 통 해 이 루어 집 니 다. 하나의 스 레 드 는 하위 프로그램 을 실행 하 는 것 입 니 다.
협 정 은 스 레 드 와 다 르 고 스 레 드 는 선점 식 의 스케줄 이 며 협 정 은 협동 식 의 스케줄 이 므 로 협 정 은 스스로 스케줄 을 해 야 한다.서브루틴 호출 은 항상 하나의 입구 이 고 한 번 에 되 돌아 오 며 호출 순 서 는 명확 합 니 다.협 정의 호출 은 서브루틴 과 다르다.협 정 도 서브루틴 으로 보이 지만 실행 과정 에서 서브루틴 내부 에서 중단 되 고 다른 서브루틴 을 실행 하 며 적당 한 시기 에 되 돌아 와 서 실행 할 수 있 습 니 다.
협정 우 위 는 매우 높 은 집행 효율 이다.서브루틴 전환 은 스 레 드 전환 이 아니 라 프로그램 자체 가 제어 하기 때문에 스 레 드 전환 비용 이 없고 다 중 스 레 드 와 비교 할 때 스 레 드 수량 이 많 을 수록 협 정의 성능 장점 이 뚜렷 합 니 다.협 정 다 임 무 를 수행 하 는 데 매우 적합 하 다.
협 정 에 스 레 드 가 없 는 안전 문제.하나의 프로 세 스 는 여러 개의 협 정 이 동시에 존재 할 수 있 지만 하나의 협 정 만 활성화 되 고 협 정의 활성화 와 휴면 은 프로그래머 가 운영 체제 가 아 닌 프로 그래 밍 을 통 해 제어 한다.협 정 은 하나의 스 레 드 에서 실행 되 기 때문에 다 핵 CPU 를 어떻게 이용 합 니까?가장 간단 한 방법 은 다 중 프로 세 스 + 협 정 으로 다 핵 을 충분히 이용 할 뿐만 아니 라 협 정의 효율 도 충분히 발휘 하여 높 은 성능 을 얻 을 수 있다.
Python 의 협 정 에 대한 지 지 는 generator 를 통 해 이 루어 졌 다.generator 에서 우 리 는 for 순환 을 통 해 교체 할 수 있 을 뿐만 아니 라 next () 함수 도 계속 호출 하여 yield 구문 에서 돌아 오 는 다음 값 을 얻 을 수 있 습 니 다.그러나 Python 의 yield 는 값 을 되 돌려 줄 뿐만 아니 라 호출 자가 보 낸 인자 도 받 을 수 있 습 니 다.
쓰다
협정 으로 생산자 소비자 문 제 를 해결 하 다.
# coding: utf-8


def consumer():
    r = ''
    while 1:
        n = yield r
        if not n:
            break

        print 'consumer receive msg: %s' % n
        r = '%s OK' % n


def produce():
    c = consumer()
    c.send(None)

    n = 0
    while n < 3:
        n += 1
        print 'produce send msg: %s' % n
        r = c.send(n)
        print 'consumer return msg: %s' % r

    c.close()

produce()

실행 결과
produce send msg: 1
consumer receive msg: 1
consumer return msg: 1 OK
produce send msg: 2
consumer receive msg: 2
consumer return msg: 2 OK
produce send msg: 3
consumer receive msg: 3
consumer return msg: 3 OK

실행 과정 분석: 1. consumer 함 수 는 generator 입 니 다.2. c. send (None) 는 사실 next (c) 와 같 습 니 다. 처음 실 행 했 을 때 n = yield r 만 실행 하면 멈 추고 r 의 값 을 호출 자 에 게 되 돌려 줍 니 다.3. yield r 는 표현 식 입 니 다. send (msg) 를 통 해 값 을 부여 하고 send (msg) 는 반환 값 이 있 습 니 다. 반환 값 은 다음 yield r 표현 식 의 매개 변수, 즉 r 입 니 다.4. produt 가 물건 을 생산 하면 c. send (n) 를 통 해 consumer 로 전환 하여 실행 합 니 다.consumer 는 yield 를 통 해 정 보 를 얻 고 처리 하 며 yield 를 통 해 결 과 를 전달 합 니 다.즉, c. send (1) 는 c 에 데 이 터 를 전송 할 뿐만 아니 라 다음 yield 가 c 에서 데 이 터 를 되 돌려 주 기 를 기다 리 고 있 습 니 다. 반환 값 이 있 습 니 다. 한 번 에 계산 하고 되 돌아 오 는 데이터 (200 OK) 를 받 아서 다음 에 계속 실 행 됩 니 다.5. 전체 프로 세 스 가 잠 겨 있 지 않 고 하나의 스 레 드 에서 실 행 됩 니 다. produce 와 consumer 가 합작 하여 임 무 를 완성 하기 때문에 스 레 드 의 선점 식 다 중 임무 가 아니 라 '협 정' 이 라 고 부 릅 니 다.
작은 매듭
TODO

좋은 웹페이지 즐겨찾기