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

参考教程

官方文档和廖雪峰教程

实例代码

这是一段取自于官方文档的代码,对于这个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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(2)
巴扎黑

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

巴扎黑
  1. 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?

  2. Coroutine mengembalikan objek coroutine (penjana) dan beberapa nilai akan "dipulangkan" selepas anda cor.send(Tiada)
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan