asynio学习日报
今天学习了asynio的用法,有说的不对的还望大神指点。
同步和异步,什么是同步,什么是异步?
同步是指在执行代码的时候,是之上而下顺序执行,如果碰到IO操作或者其他的耗时操作,那么整个程序就会阻塞在那里,这样计算机的CPU是极大的浪费
异步恰好与同步相反,我们不等待这个耗时的操作的返回结果,程序继续执行下下一个事务,当事务处理完之后通知主程序,然后把处理结果返回,这样我们就可以极大的利用电脑的CPU资源,而且代码的效率会很高
asynio不同于多线程,虽说是异步操作,但是实质上是同步代码
# 以下为模拟网页请求的异步代码,预期效果是瞬间会打印出10个hello word,而不会等到一个网页解析完之后在解析下一个,而是并发进行
import asyncio # 这里模仿请求网页的代码 async def get_html(url): await asyncio.sleep(url) print("hello word: {}".format(url)) if __name__ == "__main__": loop = asyncio.get_event_loop() c = [get_html(2) for i in range(10)] a = loop.run_until_complete(asyncio.wait(c)) # 结果: # hello word: 2 # hello word: 2 # hello word: 2 # hello word: 2 # hello word: 2 # hello word: 2 # hello word: 2 # hello word: 2 # hello word: 2 # hello word: 2
因为asynio不支持HTTP请求的异步,如果们在里面用requests库或者其他请求网页的库因为requests是同步库
这里在记录下学习到的一个知识点,asynio是支持socket异步的,因此这里使用socket的方式请求HTTP,输出的结果也是预期的结果,一样的url都是同时打印出来
import asyncio from urllib.parse import urlparse # 这里模仿请求网页的代码 async def get_html(url): iurl = urlparse(url) host = iurl.netloc path = iurl.path if path == "": path = "/" request_html = "GET {} HTTP/1.1\r\nHOST: {}\r\nConnection: close\r\n\r\n".format(path, host) reader, writer = await asyncio.open_connection(host=host, port=80) # 因为这个连接是耗时的操作因此需要用await达到异步的的效果 # 因为是向服务器发送请求因此使用writer,等同于socket中的send # 发送的数据必须是字节,不能是Unicode的编码 writer.write(request_html.encode("utf-8")) data = b"" async for d in reader: data += d # 直接打印出来 print(data) return data if __name__ == "__main__": url_list = ["http://www.guqin.cc/portal.php", "http://www.guqin.cc/thread-2564-1-1.html", "http://www.guqin.cc/thread-2564-1-1.html", "http://www.guqin.cc/thread-2564-1-1.html", "http://www.guqin.cc/thread-2564-1-1.html"] loop = asyncio.get_event_loop() c = [get_html(url) for url in url_list] a = loop.run_until_complete(asyncio.wait(c))

浙公网安备 33010602011771号