老师您好,
这课的视频中,您说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