【问题标题】:traverse two lists asynchronously?异步遍历两个列表?
【发布时间】:2022-12-08 02:24:55
【问题描述】:

我有两个列表,lzma2_list 和 rar_list。两者都有每天变化的随机数量的对象名称。这些对象所在的目录称为“O:”,有两种方法可以处理这些数据。

bkp.zipto_rar(path,object_name)
bkp.zipto_lzma(path,object_name)

我怎样才能在不等待一个完成的情况下从列表中异步获取所有项目?

使用异步列表和线程加速压缩 我尝试使用the answers to this question,但在我的例子中,方法接收 2 个参数,一个是固定的,指的是目录,另一个会不断变化,指的是列表中的项目。


【问题讨论】:

  • bkp.zipto_rarbkp.zipto_lzma 做什么?它是 IO 还是 CPU 绑定工作?
  • 我希望这些操作受 CPU 限制。因此 multiprocessing 将是您的最佳选择

标签: python list asynchronous async-await python-asyncio


【解决方案1】:

由于您的函数采用参数,因此您应该使用 functools.partial 将它们转换为不带参数的签名。

然后你可以使用asyncio.new_event_loop().run_in_executor在后台处理每个项目线程如果函数是 IO 绑定的,或者 multiprocessing.Pool 在后台处理项目流程如果它们受 CPU 限制。

您甚至可以结合两种方法并使用多种方法在每个背景中过程但是很难写出有用的例子,不知道具体细节或你的功能和列表。之后收集结果也可能不是微不足道的。

import asyncio
import functools

lzma2_list = []
rar_list = []


def process_lzma2_list():
    path = 'CONST'
    for item in lzma2_list:
        func = functools.partial(bkp.zipto_lzma, *(path, item))
        asyncio.new_event_loop().run_in_executor(executor=None, func=func)


def process_rar_list():
    path = 'CONST'
    for item in rar_list:
        func = functools.partial(bkp.zipto_rar, *(path, item))
        asyncio.new_event_loop().run_in_executor(executor=None, func=func)
        

if __name__ == '__main__':
    # it's ok to run these 2 functions sequentially as they just create tasks, actual processing is done in background
    process_lzma2_list()
    process_rar_list()

【讨论】:

    【解决方案2】:

    遍历列表元素的最常见方法是使用 for 循环。 如果您只需要阅读列表的元素,这很有效。但是如果你想写或更新元素,你需要索引。一种常见的方法是组合 rangelen 函数。

    for i in range(len(numbers)):
        numbers[i] = numbers[i] * 2
    

    【讨论】:

    • 这对 OP 关于异步执行此操作的问题有何帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多