Python 생성기 코루틴 작업에 대한 자세한 설명과 예제

巴扎黑
풀어 주다: 2017-09-05 11:11:20
원래의
1180명이 탐색했습니다.

다음 편집기는 Python 생성기 코루틴 작업의 예를 제공합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리도록 하겠습니다. 에디터를 따라 살펴보겠습니다

1. Yield 연산 방법

Generator를 다음과 같이 정의합니다.


def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
 
#输出
G:\python\install\python.exe G:/python/untitled/study4/test/double.py
 
Process finished with exit code 0
로그인 후 복사

Yield를 통해 함수를 Generator로 변환할 때 직접 실행합니다. 결과를 반환하지 않습니다. 이때 함수는 이미 생성기이므로 next()를 통해 값을 가져와야 하고, Yield를 만나면 다시 함수에서 뛰어내려야 합니다.


print(type(p))
 
#输出
<class &#39;generator&#39;>
로그인 후 복사

next() 메소드를 추가합니다:


def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield  #遇到yield中断
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name)) #中断后运行部分
 
p = put_on("bigberg")
p.__next__()
 
#输出
Hi bigberg, 货物来了,准备搬到仓库!
로그인 후 복사

이때, next() 함수를 다시 호출하면 함수는 콘텐츠만 실행합니다. 중단 후, 즉 위의 예에서 수율의 하위 부분입니다.

또 다른 next()를 추가합니다:


def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.__next__()
 
#输出
Hi bigberg, 货物来了,准备搬到仓库!
货物[None]已经被bigberg搬进仓库了。
로그인 후 복사

yield에 있는 콘텐츠의 일부에 next()를 두 번째로 실행할 수 있지만 값이 상품에 전달되지 않으므로 상품은 None입니다.

요약:

yield를 통해 함수를 생성기로 변환합니다.

yield는 함수의 인터럽트 상태만 유지합니다. Yield 이후 부분을 실행합니다

Yield가 값을 반환하지 않으면 None 빈 값을 반환합니다

2. Send()가 값을 전달합니다


def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.send("瓜子")
 
#输出
Hi bigberg, 货物来了,准备搬到仓库!
货物[瓜子]已经被bigberg搬进仓库了。
로그인 후 복사

요약:

__next__()는 그냥 이 Yield를 호출하거나 할 수 있습니다. Yield를 깨운다고 하는데, Yield에 값을 전달하지 않습니다.

send() 메소드는 Yield를 호출하고 Yield에 값을 전달할 수 있습니다.

send() 함수를 사용하기 전에 __next__()를 사용해야 합니다. 먼저 중단해야 하고 값은 호출된 경우에만 전달할 수 있기 때문입니다. 두 번째로 전화했다.


def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.send("瓜子")
p.send("花生")
p.send("饼干")
p.send("牛奶")
 
#多次调用send()
Hi bigberg, 货物来了,准备搬到仓库!
货物[瓜子]已经被bigberg搬进仓库了。
货物[花生]已经被bigberg搬进仓库了。
货物[饼干]已经被bigberg搬进仓库了。
货物[牛奶]已经被bigberg搬进仓库了。
로그인 후 복사

3. 병렬 효과를 달성하기 위한 단일 스레드(코루틴)


import time
 
 
def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
 
def transfer(name):
 p = put_on(&#39;A&#39;)
 p2 = put_on(&#39;B&#39;)
 p.__next__()
 p2.__next__()
 print("%s将货物送来了!"%name)
 for i in range(5):
  time.sleep(1)
  print("%s递过来两件货物"%name)
  p.send("瓜子")
  p2.send("花生")
 
transfer("bigberg")
 
#输出
Hi A, 货物来了,准备搬到仓库!
Hi B, 货物来了,准备搬到仓库!
bigberg将货物送来了!
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
로그인 후 복사

위 내용은 Python 생성기 코루틴 작업에 대한 자세한 설명과 예제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿