zoukankan      html  css  js  c++  java
  • 协程 -单线程下实现并发手段

    协程 -gevent模块

    • 和进程、线程都属于实现并发的手段

    • 一个线程同时处理两个任务。两个任务相互切换

    • 协程中任务之间的切换也消耗时间但是远远小于线程

      • 协程多少个确认后要.join()才能出结果

          #看不出任何效果的协程
          import gevent
        
          def eat():
              print('开始吃饭好吧')
              
          def play():
              print('开始听歌')
          g1 = gevent.spawn(eat)
          g2 = gevent.spawn(play)
          
          g1.join()	#必须执行join()告诉他就这两个协程,其他不加入了
          g2.join()
          #结果
          开始吃饭好吧
          开始听歌好吧
        
      • 协程默认是不能识别系统的I/O操作的,默认只能识别gevent.sleep()

          import time
          import gevent
        
          def eat():
              print('开始吃饭好吧')
              time.sleep(1)
              print('吃饭结束‘)
              
          def play():
              print('开始听歌')
              time.sleep(1)
              print('听歌结束')
              
          g1 = gevent.spawn(eat)
          g2 = gevent.spawn(play)
          
          g1.join()	#必须执行join()告诉他就这两个协程,其他不加入了
          g2.join()
          #结果
          开始吃饭好吧
          吃饭结束
          开始听歌好吧
          听歌结束
        
      • 需要在所有的模块之前加入from gevent import monket;monkey.pach_all()才能识别系统的I/O操作

          from gevent import monkey;monket.path_all()
          import time
          import gevent
        
          def eat():
              print('开始吃饭好吧')
              time.sleep(1)
              print('吃饭结束‘)
              
          def play():
              print('开始听歌')
              time.sleep(1)
              print('听歌结束')
              
          g1 = gevent.spawn(eat)
          g2 = gevent.spawn(play)
          
          g1.join()	#必须执行join()告诉他就这两个协程,其他不加入了
          g2.join()
          #结果
          开始吃饭好吧
          开始听歌好吧	#基本上是同时打印
          听歌结束	#一秒后基本上又是同时打印
          吃饭结束
        
      • .value()能够获取一个协程的返回值

    • 总结协程,可以识别系统的I/O操作继续另外一个任务,将在一个线程中排队的多个任务之间的I/O时间尽可能的利用用来做事情

    • 一般情况进程起CPU个数+1 (5个)

    • 一般情况一个进程起线程CPU个数 * 5 (20个)

    • 一般情况一个线程起协程200个 (200个)

    • 因此一般情况下一台计算机起最大线程数20000个

    IO模型

  • 相关阅读:
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/liliudong/p/9746288.html
Copyright © 2011-2022 走看看