协程

  由于python中的多线程比较特殊,所以协程的概念就变得尤为珍贵了,对于cpu密集型的操作,使用协程的效率无疑要好过多线程很多。因为协程的创建及其间切换的时间成本要低于线程很多。也因为这一点,很多人说,协程才是python的未来,重要不重要!!!

  python中提供协程的模块有两个,greenlet和gevent。greenlet和gevent最大的区别在于greenlet需要你自己来处理线程切换, 就是说,你需要自己指定现在执行哪个greenlet再执行哪个greenlet。ps:这两个包都不是python自带的,所以需要手动安装一下,pip就可以轻松搞定!

from greenlet import greenlet

def test1():
    print(12)
    gr2.switch()
    print(34)
    gr2.switch()


def test2():
    print(56)
    gr1.switch()
    print(78)

gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()

# 最后输出结果12  56  34  78
import gevent

def func1():
    print(123)
    gevent.sleep(1)
    print(456)

def func2():
    print('hahaha')
    gevent.sleep(1)
    print('10jq')

g1 = gevent.spawn(func1)  # 遇见认识的io会自动切换的模块
g2 = gevent.spawn(func2)
g1.join()
g2.join()
from gevent import monkey;monkey.patch_all()
import gevent
import time
import requests


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'
]

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)

start = time.time()
for url in url_lst:
    get_url(url)
print(time.time()-start)

 

posted on 2018-02-25 20:44  Kindergarten_Panda  阅读(176)  评论(0编辑  收藏  举报