python协程练习部分代码的理解?

发布于 2022-09-02 01:12:42 字数 957 浏览 13 评论 0

import asyncio
import threading

async def wget(host):
    print('wget {}'.format(host))
    reader, writer = await asyncio.open_connection(host,80)
    header = 'GET / HTTP/1.0\r\nHost: {}\r\n\r\n'.format(host)
    writer.write(header.encode('utf-8'))
    await writer.drain() #?
    while 1:
        line = await reader.readline()
        if line == b'\r\n':
            break
        print('{} header > {}'.format(host,line.decode('utf-8').rstrip()))
    writer.close()

loop = asyncio.get_event_loop()
tasks = [wget(host) for host in ['www.sina.com.cn','www.sohu.com','www.163.com']]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
# print(help(asyncio.open_connection))

问题1:遇到await处,把控制权交给指定的协程,但如何知道这个协程什么时候能执行完成并返还控制权呢?
问题2:drain这个协程作用貌似刷新写入的缓冲区,那这个wirte具体把‘请求头数据’写入到了哪里呢?
问题3:b'\r\n'处,为什么能够判断分离header和body数据,返回header的每一行都有换行啊,这样难道不会在打印第一条header信息后就会被break了?

才学习协程感觉代码好难理解,如果能画一张简易流程图,不胜感激啊。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如果没有你 2022-09-09 01:12:42

问题1:遇到await处,把控制权交给指定的协程,但如何知道这个协程什么时候能执行完成并返还控制权呢?

首先, await是异步等待, 既然你已经知道了控制权会被交出去, 那么就说明他自己是不可能自己恢复的, 必须等待外部程序(python解释器)利用send重新启动切换时的执行现场.

#调度器应该会有类似下面的代码, 恢复执行现场.

#以监听stdin的输入事件为例
selector = selectors.DefaultSelector()
selector.register(sys.stdin, selectors.EVENT_READ)

#系统使用select等方式监听事件
for key, mask in self._selector.select(0):
    for task in self._tasks_waiting_on_stdin:
        # stdin可用, 将其send给协程中断的上下文.
        task.send(sys.stdin)

问题2:drain这个协程作用貌似刷新写入的缓冲区,那这个wirte具体把‘请求头数据’写入到了哪里呢?

不甚了解asyncio模块的writer函数, 但是从代码来看, 它是直接写出到TCP连接的, 也就是http的sever端.

问题3:b'\r\n'处,为什么能够判断分离header和body数据,返回header的每一行都有换行啊,这样难道不会在打印第一条header信息后就会被break了?

这里你可能有两个问题, 一个是不是特别清楚HTTP协议, 或者你不是特别清楚python的readline函数; readline函数如果返回了\r\n就说明这一行是空行;
而http协议就是根据空行进行分割的, 注意区分空行和行尾有换行符

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文