yield from疑问

来源:12-10 生成器实现协程

慕九州4321812

2021-07-19

老师您好,

这课的视频中,您说get_socket_data() yield出去的数据会返回给source = yield from get_socket_data()。但之前讲yield from是直接传递给主调用函数,这里不应是返回给def downloader(url)函数中source吧。def get_socket_data()函数如果最后return才会被stopIteration捕捉返回给def downloader(url)函数吧。

以下为本课代码:
import socket
def get_socket_data():
yield “bobby”

def downloader(url):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.setblocking(False)

try:
    client.connect((host, 80))  # 阻塞不会消耗cpu
except BlockingIOError as e:
    pass

selector.register(self.client.fileno(), EVENT_WRITE, self.connected)
source = yield from get_socket_data()					### def downloader()会在这里暂停,直到get_socket_data()执行完并返回结果后这里会被唤醒并继续向下执行。
data = source.decode("utf8")
html_data = data.split("\r\n\r\n")[1]
print(html_data)

def download_html(html):
html = yield from downloader()

if name == “main”:
#协程的调度依然是 事件循环+协程模式 ,协程是单线程模式
pass

写回答

1回答

bobby

2021-07-21

yield from是可以在子协程和主调用之间建立通道,可以通过send方法进行发送。但是返回的值还是你这里的接收方。如果返回的值直接给主调用方了那么代码就没有意义了

0
0

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2127 学习 · 551 问题

查看课程