Python 18.1 협정
비동기 IO 를 배우 기 전에 우 리 는 먼저 협 정 을 이해한다.
협 정 은 마이크로 스 레 드, 섬유 거리 라 고도 부른다.영어 이름: Corotine.
협 정의 개념 은 일찌감치 제 기 됐 지만 최근 몇 년 이 지나 서 야 응용 됐다.
서브루틴 이나 함수 라 고 부 르 는데 모든 언어 에서 등급 호출 입 니 다. 예 를 들 어 A 호출 B, B 는 실행 중 에 C, C 실행 이 끝나 면 되 돌아 오고 B 실행 이 끝나 면 되 돌아 가 며 마지막 에 A 실행 이 끝 납 니 다.
따라서 서브루틴 호출 은 스 택 을 통 해 이 루어 집 니 다. 하나의 스 레 드 는 하위 프로그램 을 실행 하 는 것 입 니 다.
서브루틴 호출 은 항상 하나의 입구 이 고 한 번 에 되 돌아 오 며 호출 순 서 는 명확 합 니 다.협 정의 호출 은 서브루틴 과 다르다.
협 정 도 서브루틴 으로 보이 지만 실행 과정 에서 서브루틴 내부 에서 중단 되 고 다른 서브루틴 을 실행 하 며 적당 한 시기 에 다시 돌아 와 서 실행 할 수 있 습 니 다.
한 하위 프로그램 내부 에서 중단 하고 다른 하위 프로그램 을 실행 하 십시오. 함수 호출 이 아니 라 CPU 중단 과 유사 합 니 다.예 를 들 어 서브루틴 A, B: def A (): print('1')
print('2')
print('3')
def B(): print('A')
print('B')
print('C')
만약 에 협 정 에 의 해 집행 된다 고 가정 하면 A 를 집행 하 는 과정 에서 수시로 B 집행 을 중단 할 수 있 고 B 는 집행 과정 에서 A 집행 을 중단 할 수도 있다. 결 과 는 다음 과 같다.
2
x
y
3
z
그러나 A 에 서 는 B 를 호출 하지 않 았 기 때문에 협 정의 호출 은 함수 호출 보다 이해 하기 어 려 울 것 이다.
보기에 A, B 의 집행 은 약간 다 중 스 레 드 와 같 지만 협 정의 특징 은 한 스 레 드 가 집행 되 는 것 이다. 그것 은 다 중 스 레 드 에 비해 협 정 은 어떤 장점 이 있 습 니까?
가장 큰 장점 은 협 정의 높 은 집행 효율 이다.서브루틴 전환 은 스 레 드 전환 이 아니 라 프로그램 자체 가 제어 하기 때문에 스 레 드 전환 비용 이 없고 다 중 스 레 드 에 비해 스 레 드 의 수량 이 많 을 수록 협 정의 장점 이 뚜렷 합 니 다.
두 번 째 장점 은 다 중 스 레 드 의 잠 금 체 제 를 필요 로 하지 않 습 니 다. 하나의 스 레 드 만 있 고 변 수 를 동시에 쓰 는 충돌 도 존재 하지 않 기 때문에 협 정 에서 공유 자원 을 제어 하고 잠 금 을 넣 지 않 으 며 상 태 를 잘 판단 하면 됩 니 다.그래서 다 중 스 레 드 보다 집행 효율 이 훨씬 높 습 니 다.
협 정 은 하나의 스 레 드 가 실행 되 고 있 기 때문에 다 핵 CPU 를 어떻게 이용 합 니까?가장 간단 한 방법 은 다 중 프로 세 스 + 다 중 스 레 드 로 다 핵 을 충분히 이용 할 뿐만 아니 라 협 정의 높 은 효율 도 충분히 발휘 하 는 것 이다.매우 높 은 성능 을 얻다.
Python 의 협 정 에 대한 지 지 는 generator 를 통 해 이 루어 졌 다.
generator 에서 우 리 는 for 순환 을 통 해 끊임없이 교체 할 수 있 을 뿐만 아니 라 next () 함 수 를 계속 호출 하여 yield 구문 에서 돌아 오 는 다음 값 을 얻 을 수 있 습 니 다.
그러나 Python 의 yield 는 값 을 되 돌려 줄 뿐만 아니 라 호출 자가 보 낸 인자 도 받 을 수 있 습 니 다.
예 를 들 어 전통 적 인 생산자 - 소비자 모델 은 하나의 스 레 드 로 메 시 지 를 쓰 고 하나의 스 레 드 로 메 시 지 를 얻 으 며 잠 금 체 제 를 통 해 대기 행렬 을 제어 합 니 다.자칫 잠 겨 죽 을 수도 있어.
만약 에 협 정 을 바 꾸 면 생산자 가 정 보 를 생산 한 후에 yield 를 통 해 소비자 에 게 이동 하여 집행 을 시작 합 니 다. 소비자 가 집행 이 끝나 면 생산자 로 전환 하여 계속 생산 합 니 다. 효율 이 매우 높 습 니 다. def consumer (): r =''
while True: n =yield r
if not n: return
print('[Consumer] Consuming %s ...' % n)
r ='200 OK'
def produce(c):
c.send(None) n =0
while n <5: n =n+1
print('[Producer] Producing %s ...' % n)
r =c.send(n)
print('[Producer] Consumer return: %s' % r)
c.close()
c =consumer()
produce(c)
실행 결과:
[PRODUCER] Producing 1...
[CONSUMER] Consuming 1...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 200 OK
Consuser 함수 가 generator 라 는 것 을 알 게 되 었 습 니 다. consumer 를 produt 에 전송 한 후: 1. 먼저 c. send (None) 를 호출 하여 생 성 기 를 시작 합 니 다.
2. 그리고 물건 을 생산 하면 c. send (n) 를 통 해 consumer 로 전환 하여 실행 합 니 다.
3. consumer 는 yield 를 통 해 정 보 를 얻 고 처리 하 며 yield 를 통 해 결 과 를 되 돌려 줍 니 다.
4. produce 는 consumer 복귀 지 결 과 를 얻 고 다음 소식 을 계속 생산 한다.
5. produce 는 생산 하지 않 기로 결 정 했 습 니 다. c. close () 를 통 해 consumer 를 닫 고 전체 과정 이 끝 났 습 니 다.
전체 프로 세 스 가 잠 겨 있 지 않 고 하나의 스 레 드 에서 실 행 됩 니 다. produt 와 consumer 가 합작 하여 임 무 를 완성 하기 때문에 '협 정' 이 라 고 부 릅 니 다.
마지막 으로 Donald Knuth 의 한 마디 로 협 정 을 정리 하면 "서브루틴 은 협 정의 특례 이다."
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.