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))

 

posted @ 2020-03-20 20:04  _WittChen  阅读(144)  评论(0)    收藏  举报