链条传动

砥砺前行,不忘初心!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
协程:利用一个线程,分解一个线程为多个"微线程"   -----程序级别实现的,跟系统无无关
协程在IO操作时使用才能提高效率

模块:greenlet  gevent ---------gevent是对greenlet的封装(greenlet实现协程功能)

使用模块:pip3 install gevent
"""

"""
#使用greenlet
from gevent.greenlet import greenlet

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

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

gr1 = greenlet(f1)
gr2 = greenlet(f2)
gr1.switch()

"""

"""
#使用gevnet
import gevent

def foo():
    print('running in foo')
    gevent.sleep(0)
    print('Explicit context switch to foo again')

def bar():
    print('Exlicit context to bar')
    gevent.sleep(0)
    print('Implicit context switch back to bar')

gevent.joinall([
    gevent.spawn(foo),
    gevent.spawn(bar),
])
"""

# 协程应用示例:
# 协程发送先请求给f,而不等其执行完成,就发下一个
# 先把所有请求发送出去,然后再等待其执行完成(就好像一个线程又创建了多个微线程来执行任务)
from gevent import monkey;monkey.patch_all()   #默认socket是不支持执行完成通知的功能,这个就需要用monkey来封装一个具有通知功能的socket
                                                # ---没有这个,协程执行任务时还是等一个任务执行完才会创建并执行下一个任务
import gevent
import requests

def f(url):
    print('GET: ',url)
    response = requests.get(url)
    data = response.text
    print('%d received from %s' % (len(data),url))

# 批量创建任务,而不等待执行完成,最后统一等待执行结果
gevent.joinall([
    gevent.spawn(f, 'https://www.python.org/'),
    gevent.spawn(f, 'https://www.baidu.com/'),
    gevent.spawn(f, 'https://www.github.com/'),
])

 

posted on 2016-12-02 14:32  链条君  阅读(137)  评论(0编辑  收藏  举报