zoukankan      html  css  js  c++  java
  • 网络编程-----协程

    协程模块:

        from greenlet import greenlet   用法:( g1=greenlet(play),g1.switch())

        import gevent   用法: ( g2.join(), gevent.joinall([g1,g2]),gevent.sleep(0.2))

        from gevent import monkey;monkey.patch_all() # 把下面所有的模块中的阻塞都打成一个                包,然后gevent就可以识别这些阻塞事件了

    概念:

      python的线程属于内核级别的,即由操作系统控制调度
    (如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行) 
     单线程内开启协程,一旦遇到io,就会从应用程序级别
    ( 而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关)

      协程:  (简单来说就是单线程下的并发).

           指的是只在同一条线程上能够相互切换多个任务,

         遇到IO就切换实际上是我们利用协程提高工作效率的一种工作方式.

      特点:   

         (纤程,轻型线程)

         协程是操作系统级别的操作单位

         协程的切换开销更小,属于程序级的切换,对于操作系统来说是不可见的,不需要操作系统调                 度   

    线程内就可以实现并发的效果,最大限度地利用cpu
       修改共享数据不需要加锁

      他的效率如何?

         和操作系统本身没有关系,和线程也没有关系.

         而是看程序的调度是否合理

         缺点:

                 协程的本质是单线程下,无法利用多核,所以他的顺序为(一个程序开启多个进程,每个进程开启多个线程,每个线程开启协程)

        协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程.

    协程模块:

      greelet:在多个任务之间来回切换 

      gevent ;也是多个任务之间切换(比上边的更强大)

    用法:

    import time
    
    from greenlet import greenlet
    '''
    def play():#协程1
        print('娃哈哈')
        g2.switch()
        print('托儿索')
        g2.switch()
    def sleep(): # 协程2
        print('喜之狼')
        g1.switch()
        print('儿童劫')
    g1=greenlet(play)
    g2=greenlet(sleep)
    g1.switch()
    '''
    import gevent
    def play():#协程1
        print('娃哈哈')
        gevent.sleep(0.3)
        print('托儿索')
    
    def sleep(): # 协程2
        print('喜之狼')
        gevent.sleep(0.2)
        print('儿童劫')
    
    g1=gevent.spawn(play)
    g2=gevent.spawn(sleep)
    # g1.join(0.5) # 阻塞0.5秒
    # g2.join()#           #  精准的控制协程任务,一定是执行完毕之后join立即结束阻塞
    print('哈哈')
    gevent.joinall([g1,g2])
    
    
    from gevent import monkey;monkey.patch_all()  # 把下面所有的模块中的阻塞都打成一个包,然后gevent就可以识别这些阻塞事件了
    import time
    import gevent
    def play():   # 协程1
        print(time.time())
        print('start play')
        time.sleep(1)
        print('end play')
    def sleep():  # 协程2
        print('start sleep')
        time.sleep(1)
        print('end sleep')
        print(time.time())
    
    g1 = gevent.spawn(play)
    g2 = gevent.spawn(sleep)
    gevent.joinall([g1,g2])

    协程下实现socekt通信:

    服务端:
    from
    gevent import monkey;monkey.patch_all() import socket import gevent def talk(conn): while True: msg = conn.recv(1024).decode() conn.send(msg.upper().encode()) sk = socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() while True: conn,addr = sk.accept() gevent.spawn(talk,conn) 客户端: import socket import threading def task(): sk = socket.socket() sk.connect(('127.0.0.1',9000)) while True: sk.send(b'hello') print(sk.recv(1024)) for i in range(500): threading.Thread(target=task).start()
  • 相关阅读:
    Windows系统的DOS常用命令
    常用pom
    ssm整合
    pom依赖集合
    json
    软件项目管理笔记-软件项目计划
    CSS
    网络配置
    用户组
    用户管理
  • 原文地址:https://www.cnblogs.com/systemsystem/p/10116695.html
Copyright © 2011-2022 走看看