多任务三(协程)

协程的概念

  • 协程,又称微线程,纤程,也称为用户级线程,在不开辟线程的基础上完成多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行 通俗理解只要在def里面只看到一个yield关键字表示就是协程。

迭代

  • 迭代的概念:使用for循环遍历取值的过程叫做迭代
  • 可迭代对象:使用for循环遍历取值的对象叫做可迭代对象, 比如:列表、元组、字典、集合、range、字符串

判断对象是否是可迭代对象:

# 元组,列表,字典,字符串,集合,range都是可迭代对象
from collections import Iterable

# 判断对象是否是指定类型
result = isinstance((3, 5), Iterable)
print("元组是否是可迭代对象:", result)

迭代器

  • 我们创建一个迭代器对象,那么这个对象可以使用for循环进行迭代。
  • 迭代器的创建:一个类只要实现了__iter__与__next__方法这个类创建对象就是迭代器对象。
class MyIter(object):
    # iter这个返回一个迭代器对象,如果是自定义迭代器每次返回自身就可以
    def __iter__(self):
        return self

    # 返回每次迭代的值
    def __next__(self):
        return 1


# 迭代器对象
my_iter = MyIter()

for temp in my_iter:
    print(temp)
  • 迭代器停止:抛出一个异常,raise StopIteration
class MyIter(object):
    # iter这个返回一个迭代器对象,如果是自定义迭代器每次返回自身就可以
    def __iter__(self):
        return self

    # 返回每次迭代的值
    def __next__(self):
        # 停止迭代器
        # 手动抛出异常
        raise StopIteration
        return 1
# 迭代器对象
my_iter = MyIter()

for temp in my_iter:
    print(temp)
  • 遍历对象的创建
# 创建1到10的数据进行迭代

# 创建一个迭代器对象
class MyIter(object):
    def __init__(self):
        # 初始化起始的数据
        self.num = 0

    def __iter__(self):
        return self

    # 遍历的值
    def __next__(self):
        # 返回遍历的值
        self.num += 1
        # 判断如果我们的值>10那抛出异常
        if self.num > 10:
            raise StopIteration  # 停止迭代
        return self.num
        
# 创建迭代器对象
my_iter = MyIter()

# 使用循环遍历
for temp in my_iter:
    print(temp)
  • 列表与迭代器的区别:
    1.列表循环遍历的时候必须先存数据,这个比较浪费内存
    2.迭代器是迭代一次生成一次
    3.迭代器最大的一个问题是数据的生成必须有规则

生成器

  • 概念:是一类特殊的迭代器,它不需要再像上面的类一样写__iter__()和__next__()方法了, 使用更加方便,它依然可以使用next函数和for循环取值。
  • 创建生成器第一式:
# 列表推导式生成的
a = [i for i in range(10)]
for temp in a:
   print(temp)
print(a)

# 把[]改成()这个就是生成器了,一种特殊方式产生的迭代器
b = (i for i in range(10))
print(b)
for temp in b:
   print(temp)
print(b)
  • 创建生成器第二式:
# 通过函数生成,把函数中的return改成yield就是生成器
import time
def test():
    for temp in range(10):
        yield temp  # 暂停
# test()
print(test())
for temp in test():
    print(temp)
  • yield和return的对比
  • 使用了yield关键字的函数不再是函数,而是生成器。(使用了yield的函数就是生成器)
  • 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
  • 每次启动生成器都会返回一个值,多次启动可以返回多个值,也就是yield可以返回多个值
  • return只能返回一次值,代码执行到return语句就停止迭代,抛出停止迭代异常

for循环本质

# 创建1到10的数据进行迭代


# 创建一个迭代器对象
class MyIter(object):
    def __init__(self):
        # 初始化起始的数据
        self.num = 0

    def __iter__(self):
        return self

    # 遍历的值
    def __next__(self):
        # 返回遍历的值
        self.num += 1
        # 判断如果我们的值>10那抛出异常
        if self.num > 10:
            raise StopIteration  # 停止迭代
        return self.num


my_iter = MyIter()

# for temp in my_iter:
#  print(temp)

# 得到迭代的对象
iter = iter(my_iter)
while True:
    # 得到迭代的值
    try:
        print(next(iter))
    except Exception as e:
        break

yield

在这里插入图片描述

greenlet

在这里插入图片描述

gevent

在这里插入图片描述

gevent 完美版

在这里插入图片描述

理解

在这里插入图片描述

CPU效率最优方案:

  • 一个cpu
  • 一个进程
  • 一个进程里面一个线程
  • 一个线程里面多个协程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值