Python 线程池 ThreadPoolExecutor 排序问题

Python 线程池 ThreadPoolExecutor 排序问题

最近在研究有没有什么方法能优化视频合成的时间,由于图像都是一帧一帧的处理的,因此想尝试多线程的思路看能不能优化时间。
但是由于每一帧并行处理的话速度不同,就涉及到处理完后如何排序的问题(原本的顺序处理是处理一帧就马上写入文件,现在只能先暂存内存里,可以考虑减少批次来减小内存压力)。
总之是给自己看的,直接上代码:

import time
from concurrent.futures import ThreadPoolExecutor

def cc(i, all_ret, dl):
    print(f"{i} - dl = {dl}")
    time.sleep(dl)
    all_ret[i] = f"{i}, balabala"
    return all_ret[i]
# 这种方法会更好用一点,毕竟传递的参数都很简明,跟直接调用差不太多
def d():
    rets = {}
    res = []
    with ThreadPoolExecutor(max_workers=4) as pool:
        for i in range(0, 100, 10):
            r = pool.submit(cc, i, rets, 10-i//10)
            res.append(r)
    print(f"res = {[r.result() for r in res]}")
    print(f"rets = {rets}")
# 这种方法适合参数彼此都没什么关联性,或者都是列表的时候
def e():
    rets = {}
    with ThreadPoolExecutor(max_workers=4) as pool:
        ii = list(range(0, 100, 10))
        res = pool.map(cc, ii, [rets]*len(ii), [10-i//10 for i in ii])
    print(f"res = {[r for r in res]}")
    print(f"rets = {rets}")

if __name__ == '__main__':
    ...
    # d()
    e()
    # d 和 e 这两种方式都可以正常的跑多线程,而且获取的返回值是顺序的,不需要排序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值