Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-将数据从文件流式传输到支持异步IO的Kinesis Producer_Python_Python 3.x_Python Asyncio - Fatal编程技术网

Python-将数据从文件流式传输到支持异步IO的Kinesis Producer

Python-将数据从文件流式传输到支持异步IO的Kinesis Producer,python,python-3.x,python-asyncio,Python,Python 3.x,Python Asyncio,我正在使用Python 3.6中支持异步IO的Kinesis Producer模块,该模块将部署到AWS Lambda(因此我需要它与3.6兼容) 我的用例是从磁盘延迟读取一个文件(大约100MB压缩-1GB未压缩),然后将数据(一次500行)流式传输到Kinesis生成器。我希望Kinesis制作人在我阅读下一批500行时,开始将500张唱片推出Kinesis 我注意到的是,它一次读取500行的整个文件,然后开始将数据输出到Kinesis生成器。原因似乎是因为我没有调用wait asyncio

我正在使用Python 3.6中支持异步IO的Kinesis Producer模块,该模块将部署到AWS Lambda(因此我需要它与3.6兼容)

我的用例是从磁盘延迟读取一个文件(大约100MB压缩-1GB未压缩),然后将数据(一次500行)流式传输到Kinesis生成器。我希望Kinesis制作人在我阅读下一批500行时,开始将500张唱片推出Kinesis

我注意到的是,它一次读取500行的整个文件,然后开始将数据输出到Kinesis生成器。原因似乎是因为我没有调用
wait asyncio.sleep(1)
,但我也不知道这样做是否正确

def lambda_handler(event, context):
    event_loop = asyncio.get_event_loop()
    # Extract filename from event and download file from S3
    event_loop.run_until_complete(process(filename))
    pending = asyncio.Task.all_tasks()
    event_loop.run_until_complete(asyncio.gather(*pending))


async def process(filename):
    for chunk in read_lines(filename, MAX_RECORDS_IN_BATCH):
    asyncio.ensure_future(write_kinesis(chunk)).add_done_callback(callback)


def callback(result):
    print(str(result))


async def write_kinesis(records):
    future = asyncio.ensure_future(producer.put_records(records=records))
如果我将
wait asyncio.sleep(.1)
添加到
进程(文件名)
函数的末尾,那么它似乎完全可以实现我想要的功能,当然,它实际上会为此阻塞主线程。1秒

Q-这就是诀窍,用asyncio.sleep阻塞足够长的时间,让动觉制作人将数据推出吗?它睡得越少,我在内存中保存的数据就越多,因为kinesis客户端没有那么多时间将数据推出,但它会运行得更快(在一定程度上)?

Q-我这样做对吗?再一次,我尝试阅读500行,推到kinesis(异步),在kinesis客户端工作时再阅读500行,冲洗并重复。

此外,当从回调函数查看print语句时,我注意到如果write_-kinesis函数不返回任何内容,则回调函数的print语句具有
result=None
,而如果write_-kinesis函数返回Future,则回调函数的print语句具有
result=()

Q-我假设没有return语句,就没有结果,但是为什么它在状态仍然为“挂起”时调用回调函数?


编辑1:我忘了提一下,Kinesis客户端已经启用了asyncio。

您只需使用wait调用异步函数即可

async def process(filename):
    for chunk in read_lines(filename, MAX_RECORDS_IN_BATCH):
        await producer.put_records(records=chunk)

async def run():
    # Extract filename from event and download file from S3
    await process(filename)

loop = asyncio.get_event_loop()
loop.run_until_complete( run() )
loop.close()

问题到底是什么?我会编辑它,但如果你澄清一下,可能会更好:-)是的,对不起…它们被埋在很多文本中。看到变化,谢谢!这里的读取行可能是同步的-aiofiles可以异步读取文件…我不知道为什么我第一次尝试这种方式时它不起作用,但只要等待生产者调用就行了。也就是说,由于我不知道的原因,它的速度大约是在asyncio.sure_future中包装生产者调用的一半,之后是wait asyncio.sleep(.05)。但是,这超出了这个问题的范围……很有趣。您不必等待读取行中的每个块。您只需执行temp_list.append(producer.put_records()),然后执行asyncio.gather,在将所有块都启动后等待它们。