py07_06:协程

pass

 

利用greenlet完成yield的功能,实现自动切换。(yield的工作原理请参考:https://www.cnblogs.com/yeyu1314/p/12590743.html

from greenlet import greenlet
import gevent


def task1():
    while True:
        g3.switch()
        print('1')
        gevent.sleep(0.1)


def task2():
    while True:
        g1.switch()
        print('2')
        gevent.sleep(0.1)


def task3():
    while True:
        g2.switch()
        print('3')
        gevent.sleep(0.1)


g1 = greenlet(task1)
g2 = greenlet(task2)
g3 = greenlet(task3)
g1.run()
g2.run()
g3.run()

 

用gevent改造上面的代码

from gevent import monkey
import gevent
monkey.patch_all()  # 此处的monkey模块,是保证以前的延时模块能正常运行。如果没有此模块,time.sleep就无法使用。而要用gevent.sleep。但他们的作用是一样的


def task1():
    while True:
        print('1')
        gevent.sleep(1)


def task2():
    while True:
        print('2')
        gevent.sleep(1)


def task3():
    while True:
        print('3')
        gevent.sleep(1)


gevent.joinall([
    gevent.spawn(task1),
    gevent.spawn(task2),
    gevent.spawn(task3)
])

 利用gevent协程捉取图片案例

import urllib.request
import gevent


def download(download_url, img_name):
    req = urllib.request.urlopen(download_url)
    img_content = req.read()
    with open(img_name, 'wb') as f:
        f.write(img_content)


def main():
    gevent.joinall([
        gevent.spawn(download,
                     'https://rpic.douyucdn.cn/live-cover/appCovers/2020/03/01/6546636_20200301170707_small.jpg/webpdy1', '1.jpg'),
        gevent.spawn(download,
                     'https://rpic.douyucdn.cn/live-cover/appCovers/2020/03/08/8213218_20200308192958_small.jpg/webpdy1', '2.jpg')
    ])


if __name__ == '__main__':
    main()

 

posted on 2020-03-28 19:39  yeyu1314  阅读(98)  评论(0)    收藏  举报