zoukankan      html  css  js  c++  java
  • 协程

    协程

    协程: 协作式,-----非抢占式程序

              A----->B----->A----->C

              通过A执行执行一段时间,A保存;切换到B---用B执行,B保存;等等。可以自己控制什么时候切换。

    协程:又称为微线程。英文是:Coroutine

    优点:

    -协程极高的执行效率。因为子程序不是线程切换,而是由程序自身控制,因此没有切换线程的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

    -不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比线程高很多。

    因为协程本质是一个线程执行,那么怎么利用多核CPU呢。最简单的方法是多进程+协程。既充分利用多核,又充分发挥协程的效率,可以获得极高的性能

    协程例子如下:

    简单例子:例1:

    import time
    import queue

    def consumer(name):

    print("--->ready to eat baozi...")
    while True:
    new_baozi = yield
    print("[%s] is eating baozi %s" % (name,new_baozi))
    #time.sleep(1)

    def producer():

    r = con.__next__()#运行生产器
    r = con2.__next__()#运行生成器

    n = 0
    while 1:
    time.sleep(1)
    print("33[32;1m[producer]33[0m is making baozi %s and %s" %(n,n+1) )
    con.send(n)#发消息并运行生成器,相当于new_baozi = n
    con2.send(n+1)#同上
    n +=2


    if __name__ == '__main__':

    con = consumer("c1")#生成器
    con2 = consumer("c2")#生成器
    producer()

    结果是:

    --->ready to eat baozi...
    --->ready to eat baozi...
    [producer] is making baozi 0 and 1
    [c1] is eating baozi 0
    [c2] is eating baozi 1
    [producer] is making baozi 2 and 3
    [c1] is eating baozi 2
    [c2] is eating baozi 3

    .............

    会一直这样运行下去

    greenlet协程模块

    greenlet 是一个用C实现的协程模块,相比python自带的yield,它可以在任意含义之间随意切换,而不需要把这个函数先声明为生成器。

    from greenlet import greenlet

    def test1():
    print(12)
    gr2.switch()
    print(34)
    def test2():
    print(56)
    gr1.switch()
    print(78)
    gr1.switch()

    gr1 = greenlet(test1)
    gr2 = greenlet(test2)
    gr2.switch()#====>从gr2开始运行

    结果是:

    56

    12

    78

    34

    gevent 模块

    gevent 模块会自动切换不用自己每次都设置切换

    import gevent
    import requests,time
    start=time.time()
    def f(url):
    print('GET: %s' % url)#===》url 是网址
    resp =requests.get(url)#此处获得了url,已经爬下来了
    data = resp.text #打印爬下的内容
    print('%d bytes received from %s.' % (len(data), url))


    gevent.joinall([
    gevent.spawn(f, 'https://www.python.org/'),
    gevent.spawn(f, 'https://www.yahoo.com/'),
    gevent.spawn(f, 'https://www.baidu.com/'),
    gevent.spawn(f, 'https://www.sina.com.cn/'),
    gevent.spawn(f, 'http://www.xiaohuar.com/hua/'),
    ])


    print("cost time:",time.time()-start)
  • 相关阅读:
    R语言修改vector、matrix、dataframe列名
    R语言获取数据框的行数
    R语言的which函数,针对没有符合条件的返回值为integer(0),之后如何判断
    ArrayList总结
    经常涉及到的技术
    今天开始写博客啦!(测试..)
    [摘转] JS 数组合并问题
    t_category
    在 MySql 的 update 语句中使用 case when else end
    JSP 取当前时间
  • 原文地址:https://www.cnblogs.com/wode110/p/15003378.html
Copyright © 2011-2022 走看看