zoukankan      html  css  js  c++  java
  • python-协程

    概述

    协程是什么?

    协程是一种用户态的【伪轻量级线程】,即协程是由用户程序自己控制调度的
    单线程的异步编程模型就是协程
    本质上是一个线程

    特点

    1,能够在一个线程中实现并发
    2,能够规避一些任务中的IO阻塞,在任务的执行过程中,检测到IO阻塞就切换任务
    3,在一个线程上,提高CPU的利用率
    4,在多个任务之间切换
    5,协程比线程切换速度快

     1 def consumer():
     2     while True:
     3         x = yield
     4         print('处理了数据:', x)
     5 
     6 
     7 def producer():
     8     c = consumer()
     9     next(c)
    10     for i in range(10):
    11         print('生产了数据:', i)
    12         c.send(i)
    13 
    14 
    15 producer()
    通过代码实现的简单协程.py

    greenlet.greenlet模块

    方法(greenlet(func)实例化g)

    g.switch()  切换到g这个协程上运行

     1 from greenlet import greenlet
     2 
     3 
     4 def eat():
     5     print('start eat')      # 2
     6     g2.switch()             # 3,切换到g2的play()
     7     print('end eat')        # 6
     8     g2.switch()             # 7,切换到g2play()
     9 
    10 
    11 def play():
    12     print('start play')     # 4
    13     g1.switch()             # 5,切换到g1的eat()
    14     print('end play')       # 8
    15 
    16 
    17 g1 = greenlet(eat)
    18 g2 = greenlet(play)
    19 
    20 g1.switch()                 # 1,切换到g1的方法eat
    通过greenlet实现协程.py

    gevent模块

    遇到gevent能识别的/O阻塞,程序会【自动】进行任务(协程)切换,实现并发效果

    识别其他模块的阻塞

    需要打打补丁:from gevent import monkey;monkey.patch_all()必须放到被打补丁者的前面,如time,socket模块之前

    方法

    spawn()       开始一个协程

    join()      等待协程执行结束

    joinall(g_list)   for循环g_list执行里面的g对象join  # g_list 是一个可迭代参数,里面存着所有需要join的g对象 

    属性

    value    拿到协程的结果

     1 from gevent import monkey; monkey.patch_all()
     2 import time
     3 import gevent
     4 
     5 
     6 def eat():
     7     print('start eat')
     8     time.sleep(1)           # 遇到阻塞,自动切换到另一个协程
     9     print('end eat')
    10     return 9
    11 
    12 
    13 def play():
    14     print('start play')
    15     time.sleep(1)           # 遇到阻塞,自动切换到另一个协程
    16     print('end play')
    17 
    18 
    19 g1 = gevent.spawn(eat)      # 开始一个协程
    20 g2 = gevent.spawn(play)     # 开始另一个协程
    21 
    22 g1.join()       # 等待协程结束
    23 g2.join()
    24 
    25 print(g1.value)     # g1的返回值
    通过gevent实现协程.py
     1 from gevent import monkey;monkey.patch_all()
     2 import gevent
     3 import time
     4 
     5 
     6 def task():
     7     time.sleep(1)
     8     print(12345)
     9 
    10 
    11 def sync():
    12     for i in range(10):
    13         task()
    14 
    15 
    16 def async():
    17     g_lst = []
    18     for i in range(10):
    19         g = gevent.spawn(task)
    20         g_lst.append(g)
    21     gevent.joinall(g_lst)       # for循环g_lst执行join
    22 
    23 
    24 async()     # 异步
    25 # sync()      # 同步
    同步与异步的区别.py
  • 相关阅读:
    Webform Session、Cookies传值,跳转页面方式
    webform 光棒效果,删除操作弹出确定取消窗口
    webform Repeater、地址栏传值、Response
    WebForm 控件
    WebForm 页面传值
    WebForm——IIS服务器、开发方式和简单基础
    身份证件号的验证与更改
    历届试题 带分数
    算法提高 学霸的迷宫
    算法提高 最大乘积
  • 原文地址:https://www.cnblogs.com/sunch/p/9596388.html
Copyright © 2011-2022 走看看