如何将对象与可迭代对象一起传递给 executor.map?

问题描述 投票:0回答:1
import glob, os
import tarfile
import concurrent.futures

def function(file1,arc):
    print(file1)
    arc.add(file1)

destination="/home/lol/org"
src=["a","b"]
for i in src:
    if not os.path.exists(os.path.join(destination,i)):
        os.mkdir(os.path.join(destination,i))
#tFile = tarfile.open("files1.tar", 'w')
for i in src:
    name=os.path.join(destination,i,i+".tar")
    tFile = tarfile.open(name, 'w')
    os.chdir(os.path.join("/home",i))
    print(os.getcwd())
    file_list=glob.glob("*.txt")
    with concurrent.futures.ProcessPoolExecutor() as executor:
        executor.map(function,file_list,tFile)
    for f in tFile.getnames():
        print(f)
    tFile.close()

这不起作用,因为 executor.map 函数没有将 tFile 对象传递给函数。我该如何解决这个问题?

python-3.x concurrency concurrent.futures map-function
1个回答
3
投票

您可以选择创建一个长度为

tFile
len(file_list)
列表,这将需要 O(n) 空间并且效率相当低。

我会像这样使用

itertools.repeat
,因为它更节省空间,因为它是 O(1):

with concurrent.futures.ProcessPoolExecutor() as executor:
    executor.map(function,file_list,itertools.repeat(tFile, len(file_list)))

itertools 文档:

https://docs.python.org/3/library/itertools.html#itertools.repeat

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.