官方文档和廖雪峰教程
这是一段取自于官方文档的代码,对于这个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>
1. Mensimulasikan tugasan io bermakna ia mensimulasikan masa yang diperlukan untuk memproses beberapa tugasan. Contohnya, saya mengambil masa 1 saat untuk membuka tapak web, kemudian saya menggunakan asyncio.sleep(1) untuk mensimulasikan detik ini. ..
2. Apa yang dikembalikan ialah Tiada... Ia tidak menyatakan nilai pulangan secara eksplisit, jadi nilai pulangan lalai python ialah Tiada
Asyncio.sleep() sebenarnya tahu apabila anda melihat kod sumber Ia memanggil call_at secara dalaman (saya terlupa sedikit, ia sebenarnya adalah pemasa, ia bertanya penjadual, "masa" Adakah anda di sini boleh saya mulakan?