首页 > 编程语言 >python协程

python协程

时间:2022-10-26 19:02:09浏览次数:40  
标签:协程 g2 g1 python gevent print join

1、概念

协程,又称微线程。协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。

2、协程和现成的差异

 

在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。

3、协程实现方法

1)、带有yield的函数不再是普通函数,而是生成器。send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换

2)、asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。

4、协程改写生产者消费者模型

# 生产者
def prodecer():
    for i in range(100):
        yield i

# 消费者
def consumer(gen):
    for i in range(10):
        print(next(gen))

# 初始化生成器函数 -> 生成器
gen = prodecer()
consumer(gen)
consumer(gen)
consumer(gen)

5、python使用gevent实现协程

import gevent
def eat():
    print("eat 1")
    gevent.sleep(3)
    # time.sleep(3)
    print("eat 2")
    
def play():
    print("play 1")
    gevent.sleep(3)
    # time.sleep(3)
    print("play 2")

# 利用gevent.spawn创建协程对象g1
g1 = gevent.spawn(eat)
# 利用gevent.spawn创建协程对象g2
g2 = gevent.spawn(play)
    
# 如果不加join阻塞,默认主线程执行时,不等待直接结束.
# 阻塞,必须等待g1协程任务执行完毕之后,放行
g1.join()
# 阻塞,必须等待g2协程任务执行完毕之后,放行
g2.join()

6、gevent可以实现切换,不能识别time.sleep阻塞

from gevent import monkey
monkey.patch_all()
import time
import gevent

def eat():
    print("eat 1")
    time.sleep(3)
    print("eat 2")
    
def play():
    print("play 1")
    time.sleep(3)
    print("play 2")


# 利用gevent.spawn创建协程对象g1
g1 = gevent.spawn(eat)
# 利用gevent.spawn创建协程对象g2
g2 = gevent.spawn(play)
    
# 如果不加join阻塞,默认主线程执行时,不等待直接结束.
# 阻塞,必须等待g1协程任务执行完毕之后,放行
g1.join()
# 阻塞,必须等待g2协程任务执行完毕之后,放行
g2.join()

print("主线程执行结束 ... ")

7、协程相关方法

# (1) spawn(函数,参数1,参数2... ) 启动协程
# (2) join 阻塞,直到某个协程任务执行完毕之后,在执行下面代码
# (3) joinall 等待所有协程任务都执行完毕之后,放行
      g1.join()  g2.join() => 
      gevent.joinall( [g1,g2] ) (推荐)
# (4) value 获取协程任务中的返回值 g1.value  g2.value

 

标签:协程,g2,g1,python,gevent,print,join
From: https://www.cnblogs.com/songyunjie/p/16829656.html

相关文章

  • 【python】创意二维码那么多,咋不的掺和一下整一手~
    前言嗨喽~大家好呀,这里是魔王呐!网上有很多的创意二维码,看了,别的不说羡慕肯定是有的,羡慕有了这不得自己整点活~今天我们就来试试只用几行代码,生成动态二维码!开发环......
  • python numpy 基础科学计算包,数学函数库
    pipinstallnumpynumpy.array()函数,强大的N维数组对象ndarrayimportnumpyasnpa=np.array([1,2,3])print(a)[123]#多于一个维度importnumpyasnpa......
  • python 回调函数
    回调函数:回头调用一下 把函数当成一个参数传递给另外一个函数 在当前函数执行完毕之后,最后调用一下当参数传递进来的函数 add_done_callback(回调函数)功能: 支付状态......
  • python线程
    1、概念cpu执行程序的最小单位,从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。Python可以运行多线程,但和单核CPU多进程一样,在给定时刻......
  • 使用Python时常见的9个错误
    通过应用软件工程最佳实践,可以交付质量更好数据科学的项目。更好的质量可能是更少的错误、可靠的结果和更高的编码效率。最佳实践都是从错误中总结出来的,所以这里我们总结了......
  • Python代码编写辅导:CSC411 Digit Classification
    全文链接:tecdat.cn/?p=29674RequirementInthisassignment,youwillcomparethecharacteristicsandperformanceofdifferentclassifiers,namelylogisticregre......
  • python进程
    1、进程概念进程是一个执行中的程序,资源分配的最小单位。每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据。在单核CPU系统中的多进程,内存中可......
  • Python基础21
    今日内容概要第三方模块的下载与使用网络爬虫模块值requests模块网络爬虫实战之爬取链家二手房数据自动化办公领域之openpyxl模块今日内容详细第三方模块的下载与......
  • 转 python 自动监控表空间,并自动添加数据文件
    侯志清-江西南昌 python自动监控表空间,并自动添加数据文件#!/usr/bin/pythonimportosimporttimeimportlinecache#定义记录日志文件defrlog(log)......
  • python进程
    1、概念进程是一个执行中的程序,资源分配的最小单位。每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据。在单核CPU系统中的多进程,内存中可以有......