You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python列表推导式改写多进程代码?语法错误求解

使用ProcessPoolExecutor结合列表推导式实现多进程的语法错误解决

原实现代码

原本创建多进程的代码如下:

import multiprocessing
import random

def do_something(seconds):
    import time
    time.sleep(seconds)
    print(f"Finished waiting {seconds} seconds")

processes = []
for _ in range(3):
    number = random.randint(1, 2)  # 生成1-2秒的随机等待时间
    p = multiprocessing.Process(target=do_something, args=(number,))
    p.start()
    processes.append(p)

# 等待所有进程完成
for p in processes:
    p.join()

错误的尝试代码

尝试改用concurrent.futures.ProcessPoolExecutor结合列表推导式时,写出了以下错误代码:

import concurrent.futures
import random

with concurrent.futures.ProcessPoolExecutor() as executor:
    results = [(number,executor.submit(do_something, number)) for number in range(10) number=random.randint(10)]

报错信息

results = [(number,executor.submit(do_something, number)) for number in range(10) number=random.randint(10)]
                                                                                      ^^^^^^
SyntaxError: invalid syntax

错误原因

列表推导式的语法结构为[表达式 for 变量 in 可迭代对象 [if 条件]],你在for number in range(10)后直接添加number=random.randint(10)的写法不符合语法规范。你实际需要的是遍历随机生成的数值序列,而非遍历range(10)后重新赋值。

正确实现方式

方式1:直接在列表推导式中生成随机数序列

import concurrent.futures
import random

def do_something(seconds):
    import time
    time.sleep(seconds)
    return f"Finished waiting {seconds} seconds"

with concurrent.futures.ProcessPoolExecutor() as executor:
    # 生成10个1-2之间的随机数(若要和原代码一致生成3个,将range(10)改为range(3))
    results = [(number, executor.submit(do_something, number)) for number in (random.randint(1, 2) for _ in range(10))]

# 遍历结果,获取每个任务的返回值
for num, future in results:
    print(f"Random number: {num}, Result: {future.result()}")

方式2:先生成随机数列表再遍历

这种方式可读性更强,适合需要复用随机数序列的场景:

import concurrent.futures
import random

def do_something(seconds):
    import time
    time.sleep(seconds)
    return f"Finished waiting {seconds} seconds"

# 生成随机数列表
random_numbers = [random.randint(1, 2) for _ in range(10)]

with concurrent.futures.ProcessPoolExecutor() as executor:
    results = [(num, executor.submit(do_something, num)) for num in random_numbers]

# 等待任务完成并输出结果
for num, future in results:
    print(f"Random number: {num}, Result: {future.result()}")

补充说明

如果不需要保存随机数和任务的对应关系,也可以直接用executor.map简化代码:

with concurrent.futures.ProcessPoolExecutor() as executor:
    results = executor.map(do_something, (random.randint(1,2) for _ in range(10)))

for result in results:
    print(result)

内容的提问来源于stack exchange,提问作者Teodora Calota

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:37:28