zoukankan      html  css  js  c++  java
  • DAY7-Python学习笔记

    前记:

    这几天在弄小程序,view页面的开发很简单,但是在加载图片上遇到了问题,小程序的大小不能超过2M,所以大部分的图片内容要通过request请求服务器来获取,这里之前学习小程序的时候是通过网站API接口实现的,但是现在想要加载自定义的图片,一开始的想法是看看能不能自己来写后端写接口,可是我是个后端小白面对一大堆新知识显得有点措手不及,查阅资料发现TX自己有一个基于Node.js的后端Demo,可是拿到这个Demo看了看源码还是一脸懵逼,很是苦恼。想着开始学后端吧,找了一些视频发现大多是PHP的,这样我又要学习PHP了,时间根本不够。然后陷入了一个瓶颈。但是在玩弄Demo时发现有个上传图片的功能试了试,竟然发现返回了一个URL,马上实验了下发现竟然能返回我刚才上传的图片!欣喜若狂!然后知道了有COS对象存储这种东西,简直不要太爽,自定义上传图片记下URL就解决了我之前的问题,关于COS还在学习,明天试一试把!

    1.异步IO:

    当代码需要执行一个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执行其他代码了。一段时间后,当IO返回结果时,再通知CPU进行处理

    2.协程(coroutine):又称微线程,可看做子程序,Python对协程的支持是通过generator实现的

    Donald Knuth的一句话总结协程的特点:“子程序就是协程的一种特例。”

    3.asyncio:对异步IO的支持的内置标准库

    asyncio的编程模型就是一个消息循环,从asyncio模块中直接获取一个EventLoop的引用,把需要执行的协程扔到EventLoop中执行就实现了异步IO:

    import asyncio
    
    @asyncio.coroutine  #把一个generator标记为coroutine类型
    def hello():
        print("Hello world!")
        # 异步调用asyncio.sleep(1):
        r = yield from asyncio.sleep(1)
        print("Hello again!")
    
    # 获取EventLoop:
    loop = asyncio.get_event_loop()
    # 执行coroutine
    loop.run_until_complete(hello())
    loop.close()

    hello()会首先打印出Hello world!,然后yield from语法调用另一个generator,

    asyncio.sleep()也是一个coroutine(协程),所以线程不会等待asyncio.sleep(),而是直接中断并执行下一个消息循环,当asyncio.sleep()返回时,线程就可以从yield from拿到返回值(此处是None),然后接着执行下一行语句。把asyncio.sleep(1)看成是一个耗时1秒的IO操作,在此期间,主线程并未等待,而是去执行EventLoop中其他可以执行的coroutine了,因此可以实现并发执行。

    我们用asyncio的异步网络连接来获取sina、sohu和163的网站首页:

    import asyncio
    
    @asyncio.coroutine
    def wget(host):
        print('wget %s...' % host)
        connect = asyncio.open_connection(host, 80)
        reader, writer = yield from connect
        header = 'GET / HTTP/1.0
    Host: %s
    
    ' % host
        writer.write(header.encode('utf-8'))
        yield from writer.drain()
        while True:
            line = yield from reader.readline()
            if line == b'
    ':
                break
            print('%s header > %s' % (host, line.decode('utf-8').rstrip()))
        # Ignore the body, close the socket
        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()

    结果:可见3个连接由一个线程通过coroutine并发完成。

    wget www.sohu.com...
    wget www.sina.com.cn...
    wget www.163.com...
    (等待一段时间)
    (打印出sohu的header)
    www.sohu.com header > HTTP/1.1 200 OK
    www.sohu.com header > Content-Type: text/html
    ...
    (打印出sina的header)
    www.sina.com.cn header > HTTP/1.1 200 OK
    www.sina.com.cn header > Date: Wed, 20 May 2015 04:56:33 GMT
    ...
    (打印出163的header)
    www.163.com header > HTTP/1.0 302 Moved Temporarily
    www.163.com header > Server: Cdn Cache Server V2.0
    ...

    4.async/await:从Python 3.5开始引入了新的语法,让coroutine的代码更简洁易读。

    两段代码对比:把@asyncio.coroutine替换为async;把yield from替换为await

    @asyncio.coroutine
    def hello():
        print("Hello world!")
        r = yield from asyncio.sleep(1)
        print("Hello again!")
    
    
    async def hello():
        print("Hello world!")
        r = await asyncio.sleep(1)
        print("Hello again!")

    5.aiohttp可以实现单线程并发IO操作

    后记:

    囫囵吞枣总算是把教程学完了,一个星期的时间,但是大部分的语法还是掌握不牢固,虽然在写总结但是没有复习过自己的笔记,不管怎么样总算是搞完了。下一步就是实战了,激动人心的时刻! 最近事情是真的有点多也有点烦,但是这7天坚持下来了还是很满意的!未来的路还很长,抓紧时间啊!别挥霍青春了,努力了!你不会比任何人

  • 相关阅读:
    浙大数据结构课后习题 练习二 7-2 Reversing Linked List (25 分)
    浙大数据结构课后习题 练习二 7-2 一元多项式的乘法与加法运算 (20 分)
    浙大数据结构课后习题 练习一 7-1 Maximum Subsequence Sum (25 分)
    浙大数据结构课后习题 练习一 7-1 最大子列和问题 (20 分)
    PAT Basic 1019 数字黑洞 (20 分)
    PAT Basic 1017 A除以B (20 分)
    PAT Basic 1013 数素数 (20 分)
    PAT Basic 1007 素数对猜想 (20 分)
    PAT Basic 1003 我要通过! (20 分)
    自动化运维——HelloWorld(一)
  • 原文地址:https://www.cnblogs.com/xussi/p/9069961.html
Copyright © 2011-2022 走看看