zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    跳转练习
    从入门到自闭之Python--Redis
    从入门到自闭之Python--Django Rest_Framework
    从入门到自闭之Python--RESTful API规范与序列化
    从入门到自闭之Python--虚拟环境如何安装
    从入门到自闭之Python集合,深浅拷贝(大坑)
    从入门到自闭之Python编码
    从入门到自闭之Python字典如何使用
    从入门到自闭之Python列表,元祖及range
    从入门到自闭之Python整型,字符串以及for循环
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/8432300.html
Copyright © 2011-2022 走看看