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

对于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. で使用されるキーワードです。
  3. は、yield キーワードを使用できます。これは、coroutine の実装がジェネレーターベースであるためです。元の yield from を使用する理由については、 🎜>yield、これにはソースが必要です。PEP380 を参照してください。つまり、コルーチン情報を取得するために yield を使用する方が面倒なので、操作を簡素化するために yield from を追加しました。https:/ /www.python.org/dev/pe...

次のように要約します。

coroutine はジェネレーターベースであるため、yield を使用できます。そのため、sleep がジェネレーターを返すと言っても間違いではありません。 from が出てくるのは、単に yield を使うのが面倒だからです。詳しくは PEP8 を参照してください。

追伸: 最後に少しだけ述べておきます。これが、言語を学ぶためにブログを読むことをお勧めしない理由です。ブログは無料でもあります。なぜなら、より権威のある詳細な Python ドキュメントを選択してはいかがでしょうか。

いいねを押す +0
PHPzhong

コルーチンの本質はジェネレーターです

このビデオを見ることができます~
Python 3.5 の async/await 機能の実装を探索してください

いいねを押す +0
PHPzhong

なぜ一度パッケージ化する必要があるのですか?

リーリー

これも使えますか?とても困惑しています。 。 。

いいねを押す +0
巴扎黑

Python 作者が書いたこの記事、大まかな翻訳を読むことができます

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!