异步编程 - Python中的yield from的用法?
迷茫
迷茫 2017-04-18 10:04:59
0
4
429

对于yield from目前我只知道这一种用法,我对它的理解也停留在yield from generator

In [1]: def reader():
   ...:     """A generator that fakes a read from a file, socket, etc."""
   ...:     for i in range(4):
   ...:         yield '<< %s' % i
   ...:         

In [2]: def reader_wrapper(g):
   ...:     yield from g
   ...:     

In [3]: wrap = reader_wrapper(reader())

In [4]: for i in wrap:
   ...:     print(i)
   ...:     
<< 0
<< 1
<< 2
<< 3

但是在廖雪峰的异步IO教程中看见一个yield from的新用法,请问下面这个yield from asyncio.sleep(1)是什么意思,asyncio.sleep(1)也是一个生成器吗?看官方文档也没有给出明确的解释,也是直接贴的代码,拜托大神解释一下!

import asyncio

@asyncio.coroutine
def hello():
    print("Hello world!")
    # 异步调用asyncio.sleep(1):
    r = yield from asyncio.sleep(1)
    print("Hello again!")

# 获取EventLoop:
loop = asyncio.get_event_loop()
# 执行coroutine
loop.run_until_complete(hello())
loop.close()
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

모든 응답(4)
刘奇

먼저 asyncio.sleep() 함수의 정의를 찾으세요

으아악

즉, 이 함수는 코루틴 함수입니다. 코루틴 함수를 이렇게 호출하여 반환 값을 얻을 수 있습니다

으아악

왜 이런 식으로 사용할 수 있나요?

  1. await 자체는 코루틴에서 사용되는 키워드입니다.

  2. 코루틴

    의 구현이 생성기 기반이기 때문에 yield 키워드를 사용할 수 있습니다. 원본 yield from을 사용하는 이유는 무엇입니까? 🎜>yield 이건 소스가 있어야 하는데 PEP380을 보면 알 수 있습니다. 간단히 말해서 코루틴 정보를 얻기 위해 Yield를 사용하는 것이 더 번거로워서 작업을 단순화하기 위해 Yield를 추가했습니다.https:/ /www.python.org/dev/pe...

    요약하면 다음과 같습니다.
  3. 코루틴
은 제너레이터 기반이므로

yield를 사용할 수 있으므로 sleep이 제너레이터를 반환한다고 해도 틀린 말은 아닙니다. from이 나오는 이유는 yield만 사용하기에는 너무 번거롭기 때문입니다. 자세한 내용은 PEP8을 참조하세요. PS: 마지막에 몇 마디만 말씀드리겠습니다. 이것이 제가 언어를 배우기 위해 블로그를 읽는 것을 권장하지 않는 이유입니다. 더 권위 있고 자세한 공식 Python 문서를 선택하는 것이 어떨까요?

PHPzhong

코루틴의 핵심은 제너레이터입니다

이 영상을 시청하세요~
Python 3.5의 async/await 기능 구현 살펴보기

PHPzhong

왜 한번 포장해야 하나요?

으아아아

이것도 사용할 수 있나요? 매우 당황했습니다. . .

巴扎黑

Python 작성자가 작성한 대략적인 번역 글을 읽어보실 수 있습니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!