还有这种操作?异步迭代器的切片操作!!!

问题引出

对于同步中的迭代器我们可以使用itertools的islice模块来实现

# -*- coding: utf-8 -*-
# @Time : 2019/1/2 11:52 AM
# @Author : cxa
# @File : 切片.py
# @Software: PyCharm
from itertools import islice

la = (x for x in range(20))
print(type(la))
for item in islice(la, 5, 9):  # 取下标5-9的元素
    print(item)

输出

<class ‘generator‘>
5
6
7
8

那如何对异步生成器进行类似切片的操作呢?

问题产生

我在使用mongo的异步模块motor的使用,查询得到300万条数据,然后去进行操作,

async def get_data():
    data=await get_detail_datas()
    return data

发现返回结果data为AsyncIOMotorCursor类型,查阅资料得知该类型属于async_generator也就是下面要说的异步生成器。

异步生成器的形式

针对上面的结果可以通过async for进行遍历获取结果

async def get_data():
    data=await get_detail_datas()
    async for item in data:
        print(item)

但是问题来了,如何对异步迭代器进行切片操作呢。

aiostream

aiostream提供了一组流操作符,可以将它们组合在一起以创建异步操作管道.

它可以看作是itertools的异步版本,所以可以实现异步迭代器的切片功能

要求

python >= 3.6

安装

pip3 install aiostream

使用

import asyncio
from aiostream import stream

async def generate_numbers(n):
    for x in range(n):
        yield x

async def consume_some_numbers(n, m):
    zs = stream.take(generate_numbers(n), m)
    t=await stream.list(zs) #返回切片的结果列表
    print(t)
    # async with zs.stream() as streamer: #迭代
    #     # Asynchronous iteration
    #     async for z in streamer:
    #         # Print 1, 9, 25, 49 and 81
    #         print(‘->‘, z)

async def get_data():
    await consume_some_numbers(10, 5)

loop = asyncio.get_event_loop()
loop.run_until_complete(get_data())

这里使用了aiostream,和python自带的asyncio库,

首先定义异步函数generate_numbers,作用是生成迭代器,内部含有1-n。

consume_some_numbers是具体的实现方法,stream.take第一个参数可以传入一个异步迭代器函数,第二个参数是异步迭代器方法的参数。

然后函数get_data() 去调用了consume_some_numbers。

后面通过loop创建一个事件循环,然后等结果运行完毕。

总结

这里主要说的是异步迭代器的用法,需要有一定的异步基础才能看懂。

参考资料

https://aiostream.readthedocs.io/en/latest/operators.html#aiostream.stream.take

原文地址:https://www.cnblogs.com/c-x-a/p/10208179.html

时间: 2024-07-28 13:14:50

还有这种操作?异步迭代器的切片操作!!!的相关文章

092:QuerySet&#160;API详解-切片操作

QuerySet API详解-切片操作: 切片操作:有时候我们查找数据,有可能只需要其中的一部分.那么这时候可以使用切片操作来帮我们完成. QuerySet 使用切片操作就跟列表使用切片操作是一样的.示例代码如下: # books = Book.objects.all()[0:] #这两句是一样的: all和get_queryset方法是一样的 >>> 看一下all方法的源代码 books = Book.objects.get_queryset()[1:2] for item in bo

迭代器切片操作

迭代器对象一般来说是不支持像可迭代对象(list,tuple等)的切片操作. 如下示例: def count(n): while True: yield n n += 1 c = count(0) c[10:20] Trackback(most recent call last): File "<stdin>", line 1, in <module> TypeError: 'generator' object is not subscriptable iter

Python中的切片操作

Python中的切片操作功能十分强大,通常我们利用切片来进行提取信息,进行相关的操作,下面就是一些切片的列子,一起来看看吧,希望对大家学习python有所帮助. 列如我们从range函数1-100中取7的倍数,函数及结果如下所示: >>> for i in range(1,100)[6::7]: print i 7 14 21 28 35 42 49 56 63 70 77 84 91 98 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>

Python切片操作

1.切片 Python中序列包括string.list.tuple,序列可以使用切片操作,利用切片操作可以获得对应类型的变量的任意部分(子集) 比如 s="HelloWorld",我们可以通过切片操作s[0:5]获得"Hello". 序列的下标是从0开始的 从左到右,下标范围:[0,len(s)-1) 从右到左,下标范围:[-len(s),-1] 2.切片示例 切片的语法为:[start:end:step] 表示从下标start开始,以步长step跨越,以下标end

Python序列的切片操作与技巧

切片操作 对于具有序列结构的数据来说,切片操作的方法是:consequence[start_index: end_index: step]. start_index: 表示是第一个元素对象,正索引位置默认为0:负索引位置默认为 -len(consequence) end_index: 表示是最后一个元素对象,正索引位置默认为 len(consequence)-1:负索引位置默认为 -1. step: 表示取值的步长,默认为1,步长值不能为0. [注意]对于序列结构数据来说,索引和步长都具有正负两

C#异步数据接收串口操作类

C#异步数据接收串口操作类 使用C#调用传统32位API实现串口操作,整个结构特别的简单.接收数据只需要定义数据接收事件即可. 上传源代码我不会,需要源代码的请与我([email protected])联系.你也可以教我怎么上传源代码. using System; using System.Runtime.InteropServices; /// <summary> /// (C)2003-2005 C2217 Studio  保留所有权利 /// /// 文件名称:     IbmsSeri

&quot;现在已经正在使用此 SocketAsyncEventArgs 实例进行异步套接字操作&quot;的处理

"现在已经正在使用此 SocketAsyncEventArgs 实例进行异步套接字操作" 发现不少人在使用SocketAsyncEventArgs进行高性能通信开发时碰到此问题,但网络上没有具体的解决方案,因此记录分享下我的处理方式 首先此问题通常在接入连接.和数据发送.接收时出现此异常 1.接收连接时抛出此异常,需要实现接收连接的同步,使用semaphor等待即可 2.使用SocketAsyncEventArgs的核心是实现对象复用,减少对象的分配和回收从而提高程序性能.通常是使用s

Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档

array,list,dataframe索引切片操作 2016年07月19日——智浪文档 list,一维,二维array,datafrme,loc.iloc.ix的简单探讨 Numpy数组的索引和切片介绍: 从最基础的list索引开始讲起,我们先上一段代码和结果: a = [0,1,2,3,4,5,6,7,8,9] a[:5:-1] #step < 0,所以start = 9 a[0:5:-1] #指定了start = 0 a[1::-1] #step < 0,所以stop = 0 输出: [

2016.07.09-10 切片操作

切片操作: 对有序数列使用下标操作进行区域切割. 最常见的的切片操作,以list为例(其他的有序数列,例如tuple和str的切片操作都跟list相同): lst[start:end:step] start:起始索引,end:结束索引,step步长 切片操作的取值区域,包含起始索引的元素,不包含结束索引的元素 正数索引,从0开始,从左往右计数 负数索引,从-1开始,从右往左计数 实例:如果step(步长)为默认值(1)或者其他正整数时,切片顺序是从左往右,start(起始索引)必须在end(结束