zoukankan      html  css  js  c++  java
  • 协程

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

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

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

    优点:消耗资源少。无需切换消耗资源,因为是在应用上记录,不需要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])
  • 相关阅读:
    hdu4587 Two Nodes 求图中删除两个结点剩余的连通分量的数量
    洛谷3388 tarjan割点
    POJ1523 Tarjan求割点以及删除割点之后强连通分量的数量
    POJ1144 tarjan+网络中割点与割边的数量
    POJ1780 欧拉路+手写栈解决爆战问题
    Delphi 窗体函数GetForegroundWindow
    Delphi 窗体函数GetClassName
    Delphi 窗体函数GetDesktopWindow
    Delphi 窗体函数 GetTopWindow、GetNextWindow
    Delphi 调用惯例 register, pascal, cdecl, stdcall, safecall 介绍
  • 原文地址:https://www.cnblogs.com/zengsf/p/9664643.html
Copyright © 2011-2022 走看看