协程

定义:纤程,微线程。协程的本质是一个单线程程序,所以协程不能够使用计算机多核资源。

作用:能够高效的完成并发任务,占用较少的资源。因此协程的并发量较高

原理:通过记录应用层的上下文栈区,实现在运行中进行上下文跳转,达到可以选择性的运行想要运行的部分,因此提高程序的运行效率。

优点:消耗资源少。无需切换消耗资源,因为是在应用上记录,不需要cpu。无需同步互斥。IO并发性好
缺点:无法利用计算机多核

gevent
  1.将协程事件封装为函数
  2.生成协程对象
  gevent.spawn(func, argv)
    功能:生成协程对象
    参数:func 协程函数
      argv 给协程函数传参
    返回值:返回协程对象
  3.回收协程
  gevent.joinall()
    功能: 回收协程
    参数; 列表 将要回收的协程放入列表

  gevent.sleep(n)
    功能: 设置协程阻塞,让协程跳转
    参数: n 阻塞时间

  from gevent import monkey
  monkey.patch_all()
    功能:修改套接字的IO阻塞行为
    *必须在socket导入之前使用

import gevent
#这两句一定要在socket上面
from gevent import monkey
monkey.patch_all()

from socket import *
from time import ctime

def server(port):
    s = socket()
    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    s.bind(("0.0.0.0", port))
    s.listen(5)

    while True:
        c, addr = s.accept()
        print("Connect from", addr)
#       handler(c)   #循环服务器
        gevent.spawn(handler, c)   #协程服务器

def handler(c):
    while True:
        data = c.recv(1024)
        if not data:
            break
        print(data.decode())
        c.send(ctime().encode())
    c.close()


if __name__ == "__main__":
    server(8888)


greenlet:这个协程库不好的地方就是要自己来控制跳转
  greenlet.greenlet() 生成协程对象
  gr.switch() 选择要执行的协程事件

import gevent
from time import sleep

def foo(a, b):
    print("a = %d, b = %d" % (a,b))
    gevent.sleep(2)
    print("Running foo again")

def bar():
    print("Running int bar")
    gevent.sleep(3)
    print("Running foo again")


#生成协程

f = gevent.spawn(foo, 1, 2)
g = gevent.spawn(bar)

sleep(2)

gevent.joinall([f,g])
原文地址:https://www.cnblogs.com/zengsf/p/9664643.html