• 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)
  • 相关阅读:
    Kubernetes stateful set讲解以及一个基于postgreSQL的具体例子
    如何在Kubernetes里给PostgreSQL创建secret
    如何使用Kubernetes的configmap通过环境变量注入到pod里
    使用Gardener在Google Cloud Platform上创建Kubernetes集群
    通过describe命令学习Kubernetes的pod属性详解
    使用describe命令进行Kubernetes pod错误排查
    一个简单的例子理解Kubernetes的三种IP地址类型
    不同编程语言在发生stackoverflow之前支持的调用栈最大嵌套层数
    (十)golang--运算符
    (九)golang--标识符的命名规则
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/8432300.html
Copyright © 2020-2023  润新知