标签:需要 自动 小知识点 let 开启 假设 函数代码 其他 gevent
############### 协程 ##############
# 协程
# 小知识点,
# 协程和进程和线程一样都是实现并发的手段,
# 开启一个线程,创建一个线程,还是需要开销,
# 协程
# 协程本质上是一个线程,
# 什么是协程:能够在多个任务之间切换来节省一些IO时间,
# 不需要再浪费线程之间的切换了,只需要做程序之间的切换,
# 程序任务之间的切换也是需要消耗时间,但是开销远远小于进程线程之间的切换,
# from greenlet import greenlet
# # 这个模块可以实现协程的多个任务的切换,
# # 这个greenlet就是真正的协程模块,
#
# def eat():
# print("eat start")
# g2.switch()
# print("eat end")
#
#
# def play():
# print("play start")
# g1.switch()
# print("play end")
#
#
# g1 = greenlet(eat) # 注册,
# g2 = greenlet(play)
# g1.switch() # 切换
# g2.switch()
"""
eat start
play start
eat end
play end
这就是实现了协程之间的切换
"""
# 我们在工作中会使用进程,线程,协程来提高代码的并发效果,
# 最多可以启动500个协程
# 假设是4核cpu,
# 可以开5个进程,20个线程,500个协程,就是5万个,就是允许5万个并发
####################################################################
from gevent import monkey;monkey.patch_all() # 引入了这个就可以识别time.sleep了,这个必须写到最上面,
import gevent
import time
def eat():
print("eat start")
time.sleep(1)
print("eat end")
def play():
print("play start")
time.sleep(1)
print("play end")
g1 = gevent.spawn(eat) # 开启
g2 = gevent.spawn(play)
g1.join()
g2.join()
"""
你使用的时候,只需要把你的函数代码注册一下,然后就不需要管了,
遇到IO了之后,会自动切换到另外一个任务去执行,然后再次回来,
这样利用IO的时间,进入了IO(time.sleep(1))了之后不会停下来,会切换到其他的任务,然后第一个任务IO之后就切换回来,继续执行,
协程的切换就是gevent来实现的,
进程是操作系统调度的,
线程是cpu调度的最小的单位
协程本质就是一个线程,就是在线程上面来回切换而已,
进程和线程之间的切换是由操作系统完成,
协程任务之间的切换是由代码完成的,
# 协程:
# c和c++,没有协程的概念,但是python有,
# 这个协程,比线程,进程更加的简单,使用的时候是非常简单的,但是想要明白协程的这个过程,是比较复杂的,
# 使用gevent来实现协程,想要明白gevent就要明白greenlet,想要明白greenlet就要明白yield,想要明白yield就要明白生成器,想要明白生成器,就要明白迭代器,
"""
标签:需要 自动 小知识点 let 开启 假设 函数代码 其他 gevent
原文地址:https://www.cnblogs.com/andy0816/p/12289719.html