精华内容
下载资源
问答
  • python程序实现的一种单线程下的多任务执行调度器,简单来说在一个线程里,先后执行AB两个任务,但是当A遇到耗时操作(网络等待、文件读写等),这个时候gevent会让A继续执行,但是同时也会开始执行B任务,如果B在...

    一、gevent

    在这里插入图片描述

    python程序实现的一种单线程下的多任务执行调度器,简单来说在一个线程里,先后执行AB两个任务,但是当A遇到耗时操作(网络等待、文件读写等),这个时候gevent会让A继续执行,但是同时也会开始执行B任务,如果B在遇到耗时操作同时A又执行完了耗时操作,gevent又继续执行A。

    使用示例:

    import gevent
    def test(time):
    
        print(1)
    
        gevent.sleep(time)
    
        print(2)
    def test2(time):
    
        print(3)
    
        gevent.sleep(time)
    
        print(4)
    if __name__ == '__main__':
    
        gevent.joinall([
    
            gevent.spawn(test, 2),
    
            gevent.spawn(test2, 3)
    
        ])
    ----------------------------------
    
    1
    
    3
    
    2
    
    4
    

    其中gevent.sleep()是gevent自带的延时,当gevent遇到这个延时时会自动切换,这里用gevent.sleep()代替一些耗时操作,如数据库的读写、http请求、文件度写等操作,gevent给我们提供了一个很简单的协程操作。

    二、asyncio

    asyncio的使用上,感觉和gevent有异曲同工之妙

    1、基础概念:

    event_loop 事件循环:理解为一个循环的池,里面存放一些async关键词定义的协程函数,只有放到循环池里才能执行

    coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。

    task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含任务的各种状态。

    future:代表将来执行或没有执行的任务的结果。它和task上没有本质的区别

    async/await 关键字:python3.5 用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。

    import time
    
    import asyncio
    now = lambda : time.time()
    async def do_some_work(x):    # 使用async关键字定义协程
        print('Waiting: ', x)
    start = now()
    coroutine = do_some_work(2)     # 创建协程对象
    loop = asyncio.get_event_loop()    # 创建一个事件循环(池)
    loop.run_until_complete(coroutine)    # 将协程对象包装并注册协程对象
    
    2
    Waiting:  2
    TIME:  0.0004658699035644531
    

    2、创建task

    协程对象不能直接运行,需要包装成任务才能运行,上面是通过run_until_complete()方法包装成task(隐式包装),还有下面两种方式进行显式包装:

    import asyncio
    import time
    now = lambda : time.time()
    async def do_some_work(x):
        print('Waiting: ', x)
    start = now()
    coroutine = do_some_work(2)
    loop = asyncio.get_event_loop()
    # task = asyncio.ensure_future(coroutine)    # 方式一
    task = loop.create_task(coroutine)    # 方式二
    print(task)
    loop.run_until_complete(task)
    print(task)
    print('TIME: ', now() - start)
    2
    3
    4
    <Task pending coro=<do_some_work() running at /Users/ghost/Rsj217/python3.6/async/async-main.py:17>>
    Waiting:  2
    <Task finished coro=<do_some_work() done, defined at /Users/ghost/Rsj217/python3.6/async/async-main.py:17> result=None>
    TIME:  0.0003490447998046875
    

    创建task后,task在加入事件循环之前是pending状态,加入loop后运行中是running状态,loop调用完是Done,运行完是finished状态,虽说本质上协程函数和task指的东西都一样,但是task有了协程函数的状态。

    其中loop.run_until_complete()接受一个future参数,futurn具体指代一个协程函数,而task是future的子类,所以我们不声明一个task直接传入协程函数也能执行。

    3、绑定回调函数

    通过task的task.add_done_callback(callback)方法绑定回调函数,回调函数接收一个future对象参数如task,在内部通过future.result()获得协程函数的返回值。

    import asyncio
    async def test(x):
        return x+3
    def callback(y):
        print(y.result())
    coroutine = test(5)
    loop = asyncio.get_event_loop()
    task = loop.create_task(coroutine)
    task
    <Task pending coro=<test() running at <ipython-input-4-61142fef17d8>:1>>
    task.add_done_callback(callback)
    loop.run_until_complete(task)
    
    Out[10]: 8
    

    或者直接通过下面方式也能获取反馈结果

    task.result()
    4、await(挂起耗时操作)

    多任务声明了协程函数,也同时在loop中注册了,他的执行也是顺序执行的,因为在异步函数中没有声明那些操作是耗时操作,所以会顺序执行。await的作用就是告诉控制器这个步骤是耗时的,async可以定义协程对象,使用await可以针对耗时的操作进行挂起

    import asyncio
    import time
    async def test(1):
        time.sleep(1)
        print(time.time())
    tasks = [asyncio.ensure_future(test()) for _ in range(3)]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))
    
    1547187398.7611663
    1547187399.7611988
    1547187400.7632194
    
    
    Out[8]: 
    ({<Task finished coro=<test() done, defined at <ipython-input-5-1534f9ca2d8e>:4> result=None>,
      <Task finished coro=<test() done, defined at <ipython-input-5-1534f9ca2d8e>:4> result=None>,
      <Task finished coro=<test() done, defined at <ipython-input-5-1534f9ca2d8e>:4> result=None>},
     set())
    

    上面执行并不是异步执行,而是顺序执行,但是改成下面形式那就是异步执行:

    import asyncio
    import time
    async def test(t):
        await asyncio.sleep(1)
        print(time.time())
    tasks = [asyncio.ensure_future(test()) for _ in range(3)]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))
    
    1547187398.7611663
    1547187399.7611988
    1547187400.7632194
    Out[11]: 
    ({<Task finished coro=<test() done, defined at <ipython-input-9-3a874803716b>:4> result=None>,
      <Task finished coro=<test() done, defined at <ipython-input-9-3a874803716b>:4> result=None>,
      <Task finished coro=<test() done, defined at <ipython-input-9-3a874803716b>:4> result=None>},
     set())
    
    

    可见三个任务的间隔时间几乎忽略不计,这里要注意可以使用await成功挂起的对应应该是下面三种:

    原生异步函数(coroutine )
    由 types.coroutine() 修饰的生成器,这个生成器可以返回 coroutine 对象。
    包含 __await 方法的对象返回的一个迭代器
    所以即使使用saync修饰requests的方法也不支持异步,而是需要专门的异步网络请求库aiohttp。

    5、aiohttp

    aiohttp需要单独安装,然后和asyncio库一起使用,看一下案例

    async def get(url):
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                print(response)
                print(time.time())
    
    import time
    async def request():
        url = "http://www.baidu.com"
        resulit = await get(url)
    
    tasks = [asyncio.ensure_future(request()) for _ in range(10)]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))
    
    
    <ClientResponse(http://www.baidu.com) [200 OK]>
    <CIMultiDictProxy('Bdpagetype': '1', 'Bdqid': '0x94343a8f0000d2ac', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+fcb1f5fc4ea50a8475457d9dba4ffb75', 'Date': 'Fri, 11 Jan 2019 07:20:37 GMT', 'Expires': 'Fri, 11 Jan 2019 07:19:54 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=76DA9E559DEFD4059F7858332E63E4CA:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'BIDUPSID=76DA9E559DEFD4059F7858332E63E4CA; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'PSTM=1547191237; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com', 'Set-Cookie': 'BDSVRTM=0; path=/', 'Set-Cookie': 'BD_HOME=0; path=/', 'Set-Cookie': 'H_PS_PSSID=26525_1426_21079_28132_28266; path=/; domain=.baidu.com', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked')>
    1547191237.4161415
    <ClientResponse(http://www.baidu.com) [200 OK]>
    <CIMultiDictProxy('Bdpagetype': '1', 'Bdqid': '0xb19b30e80000e08d', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+6035b8e98737e4cc11dcc73ec79566cc', 'Date': 'Fri, 11 Jan 2019 07:20:37 GMT', 'Expires': 'Fri, 11 Jan 2019 07:19:48 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=76DA9E559DEFD405C594443631339D6D:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'BIDUPSID=76DA9E559DEFD405C594443631339D6D; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'PSTM=1547191237; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com', 'Set-Cookie': 'BDSVRTM=0; path=/', 'Set-Cookie': 'BD_HOME=0; path=/', 'Set-Cookie': 'H_PS_PSSID=26522_1423_21104_28132_28267_22158; path=/; domain=.baidu.com', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked')>
    1547191237.417142
    <ClientResponse(http://www.baidu.com) [200 OK]>
    <CIMultiDictProxy('Bdpagetype': '1', 'Bdqid': '0xfdf776e30000dfb4', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+0810232ebbebf660004801978cbc7056', 'Date': 'Fri, 11 Jan 2019 07:20:37 GMT', 'Expires': 'Fri, 11 Jan 2019 07:20:15 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=76DA9E559DEFD40584DF85554050AB79:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'BIDUPSID=76DA9E559DEFD40584DF85554050AB79; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'PSTM=1547191237; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com', 'Set-Cookie': 'BDSVRTM=0; path=/', 'Set-Cookie': 'BD_HOME=0; path=/', 'Set-Cookie': 'H_PS_PSSID=1465_21118_28131_28267_20718; path=/; domain=.baidu.com', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked')>
    1547191237.4221385
    <ClientResponse(http://www.baidu.com) [200 OK]>
    <CIMultiDictProxy('Bdpagetype': '1', 'Bdqid': '0x879158430000a46a', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+acdef638e6acee7494d7fce1008c87ca', 'Date': 'Fri, 11 Jan 2019 07:20:37 GMT', 'Expires': 'Fri, 11 Jan 2019 07:20:03 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=76DA9E559DEFD40593C8E085477DD125:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'BIDUPSID=76DA9E559DEFD40593C8E085477DD125; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'PSTM=1547191237; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com', 'Set-Cookie': 'BDSVRTM=0; path=/', 'Set-Cookie': 'BD_HOME=0; path=/', 'Set-Cookie': 'H_PS_PSSID=1448_21109_28131_28267; path=/; domain=.baidu.com', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked')>
    1547191237.424138
    <ClientResponse(http://www.baidu.com) [200 OK]>
    <CIMultiDictProxy('Bdpagetype': '1', 'Bdqid': '0xe5c481900000cd70', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+fb1596a42119b92bcb6a321cfd1bde58', 'Date': 'Fri, 11 Jan 2019 07:20:37 GMT', 'Expires': 'Fri, 11 Jan 2019 07:19:51 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=76DA9E559DEFD405BD554041F5821AB7:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'BIDUPSID=76DA9E559DEFD405BD554041F5821AB7; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'PSTM=1547191237; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com', 'Set-Cookie': 'BDSVRTM=0; path=/', 'Set-Cookie': 'BD_HOME=0; path=/', 'Set-Cookie': 'H_PS_PSSID=1448_21105_18560_28132_28266_20719; path=/; domain=.baidu.com', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked')>
    1547191237.4261389
    <ClientResponse(http://www.baidu.com) [200 OK]>
    <CIMultiDictProxy('Bdpagetype': '1', 'Bdqid': '0x85ab35690000c4fd', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+15e5fc3bd83c4ffcdf9698e3264f7621', 'Date': 'Fri, 11 Jan 2019 07:20:37 GMT', 'Expires': 'Fri, 11 Jan 2019 07:20:00 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=76DA9E559DEFD405C594443631339D6D:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'BIDUPSID=76DA9E559DEFD405C594443631339D6D; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'PSTM=1547191237; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com', 'Set-Cookie': 'BDSVRTM=0; path=/', 'Set-Cookie': 'BD_HOME=0; path=/', 'Set-Cookie': 'H_PS_PSSID=26522_1423_21104_28132_28267_22158; path=/; domain=.baidu.com', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked')>
    1547191237.428144
    <ClientResponse(http://www.baidu.com) [200 OK]>
    <CIMultiDictProxy('Bdpagetype': '1', 'Bdqid': '0x9620ed6b0000f26c', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+a2bfd2645e7c3d7514192a060f9644f5', 'Date': 'Fri, 11 Jan 2019 07:20:37 GMT', 'Expires': 'Fri, 11 Jan 2019 07:20:12 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=76DA9E559DEFD4055EFEDF62083FAFD3:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'BIDUPSID=76DA9E559DEFD4055EFEDF62083FAFD3; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'PSTM=1547191237; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com', 'Set-Cookie': 'BDSVRTM=0; path=/', 'Set-Cookie': 'BD_HOME=0; path=/', 'Set-Cookie': 'H_PS_PSSID=1427_21127_28132_28267; path=/; domain=.baidu.com', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked')>
    1547191237.4291408
    <ClientResponse(http://www.baidu.com) [200 OK]>
    <CIMultiDictProxy('Bdpagetype': '1', 'Bdqid': '0x912a1be40000e841', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+599a770e18be144be77bd13c371daf0a', 'Date': 'Fri, 11 Jan 2019 07:20:37 GMT', 'Expires': 'Fri, 11 Jan 2019 07:20:35 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=76DA9E559DEFD405106191D066098188:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'BIDUPSID=76DA9E559DEFD405106191D066098188; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'PSTM=1547191237; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com', 'Set-Cookie': 'BDSVRTM=0; path=/', 'Set-Cookie': 'BD_HOME=0; path=/', 'Set-Cookie': 'H_PS_PSSID=1424_21111_28132_28266; path=/; domain=.baidu.com', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked')>
    1547191237.4311435
    <ClientResponse(http://www.baidu.com) [200 OK]>
    <CIMultiDictProxy('Bdpagetype': '1', 'Bdqid': '0x943943940000b92b', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+17014bf10c56f72b235b529f8f9c177b', 'Date': 'Fri, 11 Jan 2019 07:20:37 GMT', 'Expires': 'Fri, 11 Jan 2019 07:20:31 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=76DA9E559DEFD40504EF38ED596AEC59:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'BIDUPSID=76DA9E559DEFD40504EF38ED596AEC59; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'PSTM=1547191237; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com', 'Set-Cookie': 'BDSVRTM=0; path=/', 'Set-Cookie': 'BD_HOME=0; path=/', 'Set-Cookie': 'H_PS_PSSID=1446_21118_28131_26350_28267_22158; path=/; domain=.baidu.com', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked')>
    1547191237.4331403
    <ClientResponse(http://www.baidu.com) [200 OK]>
    <CIMultiDictProxy('Bdpagetype': '1', 'Bdqid': '0xfd3e1b1f0000d880', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+39d965c50587bb578c5714a0d732b2e4', 'Date': 'Fri, 11 Jan 2019 07:20:37 GMT', 'Expires': 'Fri, 11 Jan 2019 07:20:25 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=76DA9E559DEFD4059A93CF4E300A8EEB:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'BIDUPSID=76DA9E559DEFD4059A93CF4E300A8EEB; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'PSTM=1547191237; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com', 'Set-Cookie': 'BDSVRTM=0; path=/', 'Set-Cookie': 'BD_HOME=0; path=/', 'Set-Cookie': 'H_PS_PSSID=1445_21113_28131_28267_22158; path=/; domain=.baidu.com', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked')>
    1547191237.4341416
    

    几个任务的时间之差基本忽略不计,那亲测发送一千个请求也就11秒完成,确实很给力。

    6、多进程配合使用

    asyncio、aiohttp需要配合aiomultiprocess库使用,版本要求至少3.6,贴上该库的github上的使用示例,目前还在验证:

    Usage
    Most of aiomultiprocess mimics the standard multiprocessing module whenever possible, while accounting for places that benefit from async functionality.
    
    Executing a coroutine on a child process is as simple as:
    
    import asyncio
    from aiohttp import request
    from aiomultiprocess import Process
    
    async def put(url, params):
        async with request("PUT", url, params=params) as response:
            pass
    
    async def main():
        p = Process(target=put, args=("https://jreese.sh", ))
        await p
    
    asyncio.run(main())
    If you want to get results back from that coroutine, Worker makes that available:
    
    import asyncio
    from aiohttp import request
    from aiomultiprocess import Worker
    
    async def get(url):
        async with request("GET", url) as response:
            return await response.text("utf-8")
    
    async def main():
        p = Worker(target=get, args=("https://jreese.sh", ))
        response = await p
    
    asyncio.run(main())
    If you want a managed pool of worker processes, then use Pool:
    
    import asyncio
    from aiohttp import request
    from aiomultiprocess import Pool
    
    async def get(url):
        async with request("GET", url) as response:
            return await response.text("utf-8")
    
    async def main():
        urls = ["https://jreese.sh", ...]
        async with Pool() as pool:
            result = await pool.map(get, urls)
    
    asyncio.run(main())
    

    7、多协程并发

    使用loop.run_until_complete(syncio.wait(tasks)) 也可以使用 loop.run_until_complete(asyncio.gather(*tasks)) ,前者传入task列表,会对task进行解包操作。

    7、协程嵌套

    顾名思义是一个协程中调用另一个协程,但是涉及到两个协程函数的结果处理和返回。

    async def get(url):
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                print(response)
                print(time.time())
    
    import time
    async def request():
        url = "http://www.baidu.com"
        resulit = await get(url)
    
    tasks = [asyncio.ensure_future(request()) for _ in range(10000)]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))
    

    被调用协程返回结果有下列三种方式;

    async def get(url):
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                print(response)
                print(time.time())
    async def request():
        url = "http://www.baidu.com"
        tasks = [asyncio.ensure_future(url) for _ in range(1000)]
    方式一:
        dones, pendings = await asyncio.wait(tasks) # 返回future对象,不返回直接结果
        for task in dones:
            print('Task ret: ', task.result())
    方式二:
        results = await asyncio.gather(*tasks) # 直接返回结果
    
    方式三:
        for task in asyncio.as_completed(tasks):
            result = await task
            print('Task ret: {}'.format(result)) # 迭代方式返回结果
    
    tasks = asyncio.ensure_future(request())
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))
    

    8、停止协程任务

    实现结束task有两种方式:关闭单个task、关闭loop,涉及主要函数:

    asyncio.Task.all_tasks()获取事件循环任务列表

    KeyboardInterrupt捕获停止异常(Ctrl+C)

    loop.stop()停止任务循环

    task.cancel()取消单个任务

    loop.run_forever()

    loop.close()关闭事件循环,不然会重启

    重启

    方式一:适用于内嵌协程函数,先取内嵌协程任务
    
    async def get(url):
    async with aiohttp.ClientSession() as session:
    async with session.get(url) as response:
    print(response)
    print(time.time())
    async def request():
    url = "http://www.baidu.com"
    tasks = [asyncio.ensure_future(url) for _ in range(1000)]
    dones, pendings = await asyncio.wait(tasks)
    
    task = asyncio.ensure_future(request())
    loop = asyncio.get_event_loop()
    try:
    loop.run_until_complete(task)
    except KeyboardInterrupt as e:
    asyncio.gather(*asyncio.Task.all_tasks()).cancel()
    loop.stop()
    loop.run_forever()
    finally:
    loop.close()
    
    方式二:适用于无内嵌函数,直接遍历协程任务
    
    loop = asyncio.get_event_loop()
    try:
    loop.run_until_complete(asyncio.wait(tasks))
    except KeyboardInterrupt as e:
    for task in asyncio.Task.all_tasks():
    print(task.cancel())
    loop.stop()
    loop.run_forever()
    finally:
    loop.close()
    

    ID:Python之战

    |作|者|公(zhong)号:python之战

    专注Python,专注于网络爬虫、RPA的学习-践行-总结

    喜欢研究技术瓶颈并分享,欢迎围观,共同学习。

    独学而无友,则孤陋而寡闻!

    展开全文
  • 新手学Python掌握编程规范

    万次阅读 多人点赞 2021-03-03 14:37:37
      根据 第一节课:新手学Python掌握基本概念所讲的内容,我们学习编程规范这个基本概念,就需要找到编程规范的对应的英语,然后使用英英翻译来学习。   先翻译软件来得到编程规范对应的英语,谷歌翻译结果...

    1. 什么是编程规范?

      根据 第一节课:新手学Python之掌握基本概念所讲的内容,我们要学习编程规范这个基本概念,就需要找到编程规范的对应的英语,然后使用英英翻译来学习。

      先翻译软件来得到编程规范对应的英语,谷歌翻译结果如下所示:

    展开全文
  • python学习方法总结(内附python全套学习资料)

    万次阅读 多人点赞 2019-10-29 16:50:38
    我之前做过半年少儿编程老师,一个小学四年级的小孩子都能在我的教学下独立完成python游戏,植物大战僵尸简单版,如果肯花时间,接下来的网络开发也不是问题,人工智能也可以个调包也没啥问题。。。。。所以...

    不要再问我python好不好学了
    我之前做过半年少儿编程老师,一个小学四年级的小孩子都能在我的教学下独立完成python游戏,植物大战僵尸简单版,如果要肯花时间,接下来的网络开发也不是问题,人工智能也可以学个调包也没啥问题。。。。。所以python真的是想学就一定能学会的!!!!

    **

    ----------公众号【一行玩python】----------领取资料-----------回复【python】

    **

    先聊聊互联网转行那些事儿
    很多人是小白,想从事或转行互联网,想以python为切入口,那么恭喜你,这可能是你离互联网工作最捷径的一条道路了,毕竟python相对于java,C等语言代码量小,更加简单易学,只要肯用心,最多只需要两个月,就能找到一份对应的工作,当然任何一份技能要精进都需要一万小时,得做好心理准备
    同时也许你有学历,数学,学习方法等种种问题,我将在文末一一解答
    下面将从基础语法,高阶语法,前端开发,web开发,爬虫开发,自动化运维,数据分析,人工智能介绍学习攻略,并附上全套学习资料

    1.Python基础语法-主线任务1

    使用python就像一个自由度超高的游戏,你得学会以下几点python基础语法,拿到进入这个游戏世界的钥匙:

    • 计算机组成原理
    • Python开发环境
    • Python变量
    • 流程控制语句
    • 高级变量类型
    • 函数应用
    • 文件操作
    • 面向对象编程
    • 异常处理
    • 模块和包

    2.Python高阶语法-主线任务2

    学习完基础语法,写写算法题不成问题,但是对应更复杂的环境和需求需要学习一些高阶内容,学完以下内容就可以刷副本,攒经验升级了:

    • 网络编程
    • 并发编程
    • 数据库编程
    • 正则表达式
    • Linux系统应用
    • 函数的高级应用
    • Python语法高阶
      学完以上两个主线任务就可以进行正式的工作内容,副本1,2,3一组紧密相关,副本4单独一组,副本5,6一组紧密相关,也可以从这三组选一个来学尽快加入工作

    3.副本1-前端开发

    看你对做个网页做个app有没有兴趣,学完副本3,4可以动手做一个相关的产品,来以此去求职,当然做的质量越高,学的东西就要越多,工资也是成正比的

    • HTML
    • CSS
    • PS的应用
    • JavaScript
    • jQuery
    • Vue.js框架

    4.副本2-后端开发

    对于网页,游戏等的后台支持,需要熟练掌握框架的使用,掌握数据库原理及相关优化

    • Djano框架
    • 数据库mySQL,Redis,MongoDB
    • git项目管理
    • 接口开发
    • flask框架

    5.副本3-爬虫

    爬虫就是爬取网络上的数据,无论是网页还是app,只要你能看到的数据都能爬取下来,当然有爬虫就有反爬虫,两种职业互相博益还是挺有意思的,精通爬虫必须要精通副本1-前端开发,你得知道网页时怎么来的,才能更好的爬取下来,爬下来的数据也可以为副本4-数据分析做准备

    • 爬虫开发
    • scrapy框架
    • 索引操作
    • 备份和回复
    • 定制化爬虫采集系统

    6.副本4-自动化运维

    主要利用shell来做一些自动化脚本的发布

    7.副本5-数据分析

    数据分析主要学习两个科学计算库numpy和pandas,两个可视化库matplotlib和seaborn,学完之后数据清洗,数据展示没有问题,用python画出了图才能给别人讲出有意思的故事,同时也能为学习副本6-人工智能打下牢固的基础

    • 数据结构和算法
    • 科学计算pandas和numpy
    • 数据可视化matplotlib和seaborn
    • 金融数据分析等

    8.副本6-人工智能

    python之所以能火,主要是因为人工智能的风口,所谓风口上的 都会飞,那么python也许就是风口上的代码,人工智能的两大目的分别是分类和预测,主要在识别图片和预测未来等应用场景,同时python又有最大开源库可以调用这些包来应用,所以应用起来非常方便,但是如果想从事人工智能行业,需要一定的数学基础,了解底层算法,才能更好的进入到神经网络和深度学习的领域

    • 机器学习
    • 量化交易
    • 机器视觉
    • 深度学习
    • 自然语言处理

    相关问题

    1.学历重要吗

    python是一门技术语言,在技术岗面试的时候主要看面试者技术能力过不过硬,学历占比没有非技术岗那么大

    2.数学差可以学python吗

    python是一门编程语言主要讲究逻辑,用到数学的地方不多,但是在人工智能(机器学习)方面用到了大量的概率统计的数学知识,需要有一定的基础理解其中的原理,才能精进

    3.学习时候要不要抄代码

    要抄代码,就像下笔如有神一样,边学边敲代码,然后再改代码,然后再自己写代码一步步进阶

    4.各个副本的职业前景

    从就业前景来看:AI人工智能 > python后端 > web前端 > 数据分析 > 爬虫 但是任何一个副本只要打到10000小时经验值,钱景都非常可观
    在这里插入图片描述

    展开全文
  • Python学习之Turtle

    千次阅读 2019-08-19 16:58:05
    在学习Python的过程中,如果需要用到绘图工具,那么就需要使用到Python的turtle,turtlePython中一个很流行的绘图函数,主要是依据坐标轴来绘制图像,画笔则是一只小海龟,通过控制海龟的在坐标平面的移动,...

    Python真是太火了,最近我也入了Python的坑,开始自学Python

    在学习Python的过程中,如果需要用到绘图工具,那么就需要使用到Python的turtle库,turtle库是Python中一个很流行的绘图函数库,主要是依据坐标轴来绘制图像,画笔则是一只小海龟,通过控制海龟的在坐标平面的移动,从而绘制各种各样的图像。

    Turtle最早来自于LOGO语言,是专门用于小孩子学习编程的,通过编程模拟一只turtle(海龟)在画板上爬行绘制图案,后来很多高级语言都移植了海龟绘图,python从2.6之后也将turtle库加入了其内部库中。由于是内部库,使用import turtle语句就能引入turtle库,绘图主要有以下几个步骤:设置画板、设置画笔、控制海龟移动绘制图形、色彩填充。

    初学 Python,想要使用 Python 的turtle库绘制复杂的图形可能有点困难,可以看看下方视频,听知名技术专家李刚老师对Python turtle库的详细解析。

    李刚老师出版的《疯狂java》体系图书曾得到市场的广泛认可,经过多次再版,并被多家高校选作教材。上方视频来自于李刚老师的在线视频课程《21天通关Python》第二章第二节列表与元组的简单使用。

    大家都有学习Python的困惑,今天就给大家推荐一本巨有影响力的Python实战书,上线时间仅2个月,就超越了众多实力派,成京东和当当网上的长期畅销图书,并且收获了3.4W的五星好评。

    这本书可谓是笔者独家私藏图书之一了,对我学习Python有着莫大的帮助,在京东上也常常"断货",这次拿出来给大家分享一下,希望能帮到大家。

    《21天通关Python》视频课程以畅销图书为教材,由图书作者李刚亲自操刀讲解;上手门槛低,可作为0基础掌握Python教材;书籍+线上复合型学习场景特别适合Python小白学习!

    点击查看课程:https://edu.csdn.net/bundled/detail/49?utm_source=jiansuopy9_2

    (含图书邮寄+视频教程+社群答疑+导师带队)笔者跟大家分享一个福利!下单时输入优惠码csdn66,立减20元,券后仅需99元!

    扫码入Python技术交流群,可免费听技术讲座+领学习资料+视频课免费看!

    在这里插入图片描述

    展开全文
  • 学习python需要掌握的技能

    千次阅读 2018-07-27 14:52:40
    Python完成项目,编写的代码量更少,代码简短可读性强,团队协作开发时读别人的代码速度会非常快,使工作变得更加高效。优雅做开发不再是梦,...你需要在Python的新版本下使用你获得的新,然后检查你的应用程序...
  • TurtlePython语言中一个非常流行的绘制图像的函数,想象一只小乌龟,在一个横轴为x、纵轴为y的坐标系原点(0, 0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制图形。...
  • Python学习需要掌握哪些“技能”

    千次阅读 2020-03-01 14:49:12
    ☞☞☞点击查看更多优秀Python博客☜☜☜  Hello大家好,我是你们的朋友JamesBin这篇文章我们一起讨论一下学习Python到底需要哪些素养...想成为一名优秀的Python工程师我们需要掌握以下几个基本技能: Pyt...
  • 这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己得较为全面。 (2)Python零基础到数据分析开发 这是...
  • 胶水语言”,因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的,简单的说就很轻松的把不同语言开发的系统整合在一起。目前百度、阿里巴巴、腾讯等一系列大公司都在使用Python完成各种任务,Python发展...
  • 必须掌握的10大Python库

    千次阅读 2019-08-08 12:08:11
    在本文中,我们将讨论Python中的一些顶级,开发人员可以使用这些来编写,清理和表示数据,并在现有应用程序中实现机器学习。我们将介绍以下10个:TensorFlow...
  • 下面这篇文章给大家介绍了python爬虫基本知识,感兴趣的朋友一起看看吧 文章目录爬虫简介一、请求-响应二、GET-POST三、异常处理 爬虫简介 根据百度百科定义:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区...
  • (玩Cozmo机器人,学Python编程,掌握ROS和AI技术) 跟随绿色激光点运动?如何实现? 在黄色边缘线的赛道上行驶?如何实现? 这是一篇轻松愉快的博文,简单聊聊如何从玩机器人,升级为开发和设计机器人的...
  • 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给...
  • Python学习宝藏,建议收藏!
  • 零基础掌握 Python 入门到实战

    万人学习 2019-11-08 15:16:01
    具体来说,就是在这部分介绍Python标准的应用以及第三方包的安装,还有如何开发和发布自己的工具包。此外,很多学习Python的同学,未来要么从事数据科学、要么从事Web开发,不论哪个方向,都离不开对数据库的...
  • 150讲轻松学习Python网络爬虫

    万人学习 2019-05-16 15:30:54
    另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想的数据,这门课程,你都能到!        2、如果是作为一个其他行业的开发者,比如app开发...
  • 来看一下有哪些一定要学Python标准,有哪些建议Python第三方(第三方框架)。这些标准和第三方一定会成为你学习Python路上的得力助手! 必标准 什么是标准?就是Python语言自带的一些函数。...
  • Python数据可视化Seaborn,通过学习本教程,可以快速掌握Seaborn可视化操作。本案例中结合泰坦尼克号,鸢尾花数据,国际航班飞行数据 Python数据可视化Seaborn,通过学习本教程,可以快速掌握Seaborn可视化操作...
  • 潘石屹近日在社交媒体平台发言称自己要学python了!一石激起千层浪,这让所有的吃瓜群众纷纷咋舌:Python是啥?怎么学Python?笔者今天就来和大家说一说:如何高效地学习Python,快速步入人工智能领域、升职加薪! ...
  • 但是,由于正则表达式难以掌握,我们用一个第三方:BeautifulSoup,来对网页内容进行截取 正文 一,下载并安装BeautifulSoup 如果python3.x安装了pip3,就可以使用pip3命令行来安装BeautifulSoup pip3 install ...
  • 一文搞定 Python 正则表达式初阶用法
  • wxPython:python首选的GUI

    万次阅读 多人点赞 2018-09-14 11:19:27
    跨平台的GUI工具,较为有名的当属GTK+、Qt 和 wxWidgets 了。GTK+是C实现的,由于C语言本身不支持OOP,因而GTK+上手相当困难,写起来也较为复杂艰涩。Qt 和 wxWidgets 则是C++实现的,各自拥有庞大的用户群体。...
  • Python GUIPyQt5视频教程,内容包括pyqt5的安装、环境搭建、配置,桌面系统的开发等。该系列课程一共20套,每一套视频课程会深入讲解Python的一类知识点。Python是当今炙手可热的编程语言,可用于多个领域,人工...
  • 学Python大概多久?很多人都觉得,Python是一门很好学的语言,非常适合入门。但更多人都是不清楚具体原因的。那么,我们不如一起来看看Python为何更适合初学者,为何更适合学习吧。另外,这门伟大的入门编程语言有...
  • 本系列课程一共20套,每一套视频课程会深入讲解Python的某一类知识点。本系列课程深入介绍了Python语言的方方面面,也是李宁老师其他课程的基础,如深度学习、科学计算、Web开发(Django Web框架)、全站开发、运维...
  • 零基础学Python

    2019-05-08 10:32:23
    零基础学Python 内容介绍:1 掌握Python3的基础语法及编码规范,从小白到入门;2 掌握正确的编程思维方法和代码规范,写出简洁、易懂的规范代码;3 学会多线程等高级编程方法,编写出更复杂的应用;4 掌握大量实用的...
  •  ????相信不少小伙伴们通过我的...两万字博文教你python爬虫requests【详解篇】????    ????但是爬虫爬虫,重在爬取到我们想的数据,那么我们该如何提取页面中我们所需要的信息呢?为了让小伙伴们更加深入的学习
  • 滚雪球 Python 之怎么玩转时间和日期

    千次阅读 多人点赞 2021-03-05 21:00:56
    Python 里面的日期和时间,知识点还真的挺多
  • Python进阶(二十一)-Python学习进阶资料

    万次阅读 多人点赞 2017-03-26 10:44:23
    Python进阶(二十一)-Python学习进阶资料  学习Python已经将近2周了,掌握了基本的语法,并学习了简单的爬虫操作,现将相关学习资料整理如下。大部分资料均取材于慕课网,感觉一路下来受益匪浅。1.Python入门2....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,589
精华内容 23,835
关键字:

学python必须要掌握的库

python 订阅