다음 편집기는 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 'generator'>
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('A') p2 = put_on('B') 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!