协程

# 串行执行时间  1.2812573909759521
# import time
#
#
# def func1():
#     for i in range(10000000):
#         i += 1
#
#
# def func2():
#     for i in range(10000000):
#         i += 1
#
#
# start_time = time.time()
# func1()
# func2()
# print(time.time() - start_time)

'''
协程是将单线程运行状态变成只有就绪态和运行态,
用代码取消IO阻塞,实行一种检测机制,比如监测两个函数,如果一个函数遇到IO阻塞时,
他会自动切到另一个函数,执行另一个函数的代码,另一个函数再遇到IO阻塞时,
会再切回原来的函数,
如果两个函数都遇到IO阻塞时,他会来回切换

最佳运行状态是   多进程加多线程加协程
'''

'''
进程:资源单位
    线程:执行单位
    协程:单线程下实现并发

    并发
        切换+保存状态
        ps:看起来像同时执行的 就可以称之为并发

    协程:完全是程序员自己意淫出来的名词
        单线程下实现并发

    并发的条件?
        多道技术
            空间上的复用
            时间上的复用
                切换+保存状态

程序员自己通过代码自己检测程序中的IO
一旦遇到IO自己通过代码切换
给操作系统的感觉是你这个线程没有任何的IO
ps:欺骗操作系统 让它误认为你这个程序一直没有IO
从而保证程序在运行态和就绪态来回切换
提升代码的运行效率
'''
import time
from gevent import monkey;monkey.patch_all()  # 由于该模块经常被使用 所以建议写成一行
from gevent import spawn

'''
注意gevent模块没办法自动识别time.sleep等IO
需要手动再配置一个参数,这个参数就是
from gevent import monkey;monkey.patch_all()
'''


def heng(n):
    print('', n)
    time.sleep(2)
    print('哼哼', n + 1)


def ha():
    print('')
    time.sleep(3)
    print('哈哈')


def hei():
    print('')
    time.sleep(5)
    print('嘿嘿')


start = time.time()
obj1 = spawn(heng, 1)  # 他会自动执行函数,并监测IO  这里的传入参数的方式与进程池相近
obj2 = spawn(ha)  # spawn会检测所有的任务
obj3 = spawn(hei)
obj1.join()  # 这里必须加join  不加join就会直接执行下面的代码  主进程不会等待这个进程
obj2.join()
obj3.join()
print('耗时%s' % (time.time() - start))  # 耗时5.004220008850098
# # 这样我们在单进程下实现了并发,这就是协程

 

posted @ 2019-08-18 16:30  Nmdlao  阅读(109)  评论(0编辑  收藏  举报