对于Python协程中关于asyncio.sleep(1)的困惑?
高洛峰
高洛峰 2017-04-18 10:06:56
0
2
522

参考教程

官方文档和廖雪峰教程

实例代码

这是一段取自于官方文档的代码,对于这个asyncio.sleep(1)有点不理解,官方文档对于它的描述是"This function is a coroutine."

对于yield from它的用法又是这样解释的:

result = await coroutine or result = yield from coroutine – wait for another coroutine to produce a result (or raise an exception, which will be propagated). The coroutine expression must be a call to another coroutine.

import asyncio
import datetime

@asyncio.coroutine
def display_date(loop):
    end_time = loop.time() + 5.0
    while True:
        print(datetime.datetime.now())
        if (loop.time() + 1.0) >= end_time:
            break
        yield from asyncio.sleep(1)

loop = asyncio.get_event_loop()
# Blocking call which returns when the display_date() coroutine is done
loop.run_until_complete(display_date(loop))
loop.close()

执行结果

2016-12-18 16:27:04.706730
2016-12-18 16:27:05.708139
2016-12-18 16:27:06.709590
2016-12-18 16:27:07.711203
2016-12-18 16:27:08.712784

问题描述

问题一

display_date(loop)本身也是一个协程,asyncio.sleep(1)也是一个协程,请问sleep这个协程是怎么实现的?看到一些教程说yield from asyncio.sleep(1)用来模拟IO任务,请问大神能举一下例子怎么将这个asyncio.sleep(1)模拟程成真正的IO任务吗?也就是说编写一个自己的模拟IO任务的协程,而不是使用抽象的asyncio.sleep(1)。

问题二

对于loop.run_until_complete(display_date(loop))这段代码display_date(loop)返回的结果是什么?

抱歉因为英文不是很好,官方文档看起来有点吃力,尽力了但是问题描述的还是有点乱,如果描述的不够详细,拜托大神在评论区留言一下,我再改进!

补充

In [1]: def reader():
   ...:     for i in range(4):
   ...:         yield i
   ...:         

In [2]: def reader_from(g):
   ...:     yield from g
   ...:   
  
In [3]: wrap = reader_from(reader())

In [4]: wrap
Out[4]: <generator object reader_from at 0x7f55b3c02200>

In [5]: reader()
Out[5]: <generator object reader at 0x7f55b3c02ba0>

问题提的没水平,已关闭

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(2)
巴扎黑

1. io タスクのシミュレートとは、たとえば、Web サイトを開くのに 1 秒かかる場合、この秒間をシミュレートするために asyncio.sleep(1) を使用することを意味します。 ..

2. 返されるのはNoneです...戻り値を明示的に指定していないため、Pythonのデフォルトの戻り値はNoneです

いいねを押す +0
巴扎黑
  1. Asyncio.sleep() は、ソースコードを見ると実際には call_at を呼び出していることがわかります (少し忘れましたが、実際はこれであるはずです)。スケジューラー「時間」 始めてもいいですか?

  2. コルーチンはコルーチン (ジェネレーター) オブジェクトを返します。cor.send(None)
  3. の後に一部の値が「返されます」

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート