使用ThreadPoolExecutor时如何保持输入的原始顺序?

mar*_*lon 7 python threadpoolexecutor

from concurrent.futures import ThreadPoolExecutor, as_completed

def add_one(number, n):
    return number + 1 + n

def process():
    all_numbers = []
    for i in range(0, 10):
        all_numbers.append(i)

    threads = []
    all_results = []
    with ThreadPoolExecutor(max_workers=10) as executor:
        for number in all_numbers:
            threads.append(executor.submit(add_one, number))

        for index, task in enumerate(as_completed(threads)):
            result = task.result()
            #print(result)
            all_results.append(result)

    for index, result in enumerate(all_results):
        print(result)

process()
Run Code Online (Sandbox Code Playgroud)

如果我设置max_works=1,则会按顺序打印出1到10;如果我设置 max_workers = 10,则顺序可能是随机的:

5
3
10
7
1
8
6
2
4
9
Run Code Online (Sandbox Code Playgroud)

当使用 ThreadPoolExecutor 处理项目列表时,如何保持输入的原始顺序(如本例所示)?

ror*_*rra 6

您可以使用ThreadExecutor的map方法:

from concurrent.futures import ThreadPoolExecutor, as_completed

def add_one(number):
    return number + 1

def process():
    all_numbers = []
    for i in range(0, 10):
        all_numbers.append(i)

    all_results = []
    with ThreadPoolExecutor(max_workers=10) as executor:
        for i in executor.map(add_one, all_numbers):
            print(i)
            all_results.append(i)

    for index, result in enumerate(all_results):
        print(result)

process()
Run Code Online (Sandbox Code Playgroud)

根据评论要求更新答案:

from concurrent.futures import ThreadPoolExecutor, as_completed

def add_one(args):
    return args[0] + 1 + args[1]

def process():
    all_numbers = []
    for i in range(0, 10):
        all_numbers.append([i, 2])

    all_results = []
    with ThreadPoolExecutor(max_workers=10) as executor:
        for i in executor.map(add_one, all_numbers):
            print(i)
            all_results.append(i)

    for index, result in enumerate(all_results):
        print(result)

process()
Run Code Online (Sandbox Code Playgroud)