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

参考教程

官方文档和廖雪峰教程

实例代码

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

répondre à tous(2)
巴扎黑

1. Simuler des tâches io signifie qu'il simule le temps nécessaire au traitement de certaines tâches. Par exemple, il me faut 1 seconde pour ouvrir un site Web, puis j'utilise asyncio.sleep(1) pour simuler cette seconde. ..

2. Ce qui est renvoyé est Aucun... Il ne spécifie pas explicitement de valeur de retour, donc la valeur de retour par défaut de python est Aucun

巴扎黑
  1. Asyncio.sleep() le sait en fait quand vous regardez le code source. Il appelle call_at en interne (j'ai un peu oublié, ça devrait être ça). Quand il est inactif, il demande. le planificateur, "time" Êtes-vous là ? Puis-je commencer "

  2. La coroutine renvoie un objet coroutine (générateur), et certaines valeurs seront "renvoyées" après votre cor.send(None)

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal