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 这两种方式都可以正常的跑多线程,而且获取的返回值是顺序的,不需要排序