• 40、协程


    1、协程(greenlet模块):在单线程中切换状态得模块  。greenlet模块封装在gevent内部。

    import time
    from greenlet import greenlet
    def eat1():
        print('吃鸡腿1')
        g2.switch()          #线程切换到其他任务
        time.sleep(2)
        print('吃鸡腿2')
        g2.switch()
    
    
    def eat2():
        print('吃饺子1')
        g1.switch()
        print('吃饺子2')
    
    
    g1=greenlet(eat1)
    g2=greenlet(eat2)
    g1.switch()   

    2、gevent:在实现切换线程得基础上又实现了规避IO  

    from gevent import monkey;monkey.patch_all()
    import time     # time socket urllib requests
    import gevent   # greenlet gevent在切换程序的基础上又实现了规避IO
    from threading import current_thread
    def func1():
        print(current_thread().name)
        print(123)
        time.sleep(1)
        print(456)
    
    def func2():
        print(current_thread().name)   # dummythread
        print('hahaha')
        time.sleep(1)
        print('10jq')
    
    g1 = gevent.spawn(func1)  # 遇见他认识的io会自动切换的模块
    g2 = gevent.spawn(func2)
    # g1.join()   #分别加入和joinall是一样的
    # g2.join()
    gevent.joinall([g1,g2])

    3、爬取网页的例子

    from gevent import monkey;monkey.patch_all()
    import time
    import gevent
    import requests
    
    # 爬取网页
    # 10个网页
    # 协程函数去发起10个网页的爬取任务
    def get_url(url):
        res = requests.get(url)
        print(url,res.status_code,len(res.text))
    
    url_lst =[
        'http://www.sohu.com',
        'http://www.baidu.com',
        'http://www.qq.com',
        'http://www.python.org',
        'http://www.cnblogs.com',
        'http://www.mi.com',
        'http://www.apache.org',
        'https://www.taobao.com',
        'http://www.360.com',
        'http://www.7daysinn.cn/'
    ]
    
    start = time.time()
    for url in url_lst:
        get_url(url)
    print(time.time() - start)
    from gevent import monkey;monkey.patch_all()
    import time
    import gevent
    import requests
    
    # 爬取网页
    # 10个网页
    # 协程函数去发起10个网页的爬取任务
    def get_url(url):
        res = requests.get(url)
        print(url,res.status_code,len(res.text))
    
    url_lst =[
        'http://www.sohu.com',
        'http://www.baidu.com',
        'http://www.qq.com',
        'http://www.python.org',
        'http://www.cnblogs.com',
        'http://www.mi.com',
        'http://www.apache.org',
        'https://www.taobao.com',
        'http://www.360.com',
        'http://www.7daysinn.cn/'
    ]
    
    g_lst = []
    start = time.time()
    for url in url_lst:
        g = gevent.spawn(get_url,url)
        g_lst.append(g)
    gevent.joinall(g_lst)
    print(time.time() - start)
  • 相关阅读:
    hdu 1978 How many ways
    hdu 2209 翻纸牌游戏
    hdu 2149 Public Sale (博弈规律题)
    CF 353C Find Maximum #205 (Div. 2)
    barrier and Fence
    window coordinate
    GPU hang
    the application was unable to start correctly 0xc000007b
    vertex buffer 数据结构 如何读vb的memory pool
    map
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/8432300.html
Copyright © 2020-2023  润新知