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])
  • 相关阅读:
    洛谷 P3391 文艺平衡树
    [ZJOI2008]杀蚂蚁 Solution
    POJ P3667 Hotel——solution
    洛谷 P2469 [SDOI2010]星际竞速 解题报告
    POJ P2318 TOYS与POJ P1269 Intersecting Lines——计算几何入门题两道
    【linux】基础知识学习
    【linux】打包压缩命令
    【python】类file文件处理
    【python】使用asyncore进行异步通信
    【python】命令行解析工具getopt用法
  • 原文地址:https://www.cnblogs.com/zengsf/p/9664643.html
Copyright © 2011-2022 走看看