如何用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
相关产品推荐
相关产品推荐

