我正在尝试使用Jupyter Notebook并行化一个简单的python循环。我试图使用Pool
但它只是永远挂起,我必须杀死笔记本才能阻止它。
def process_frame(f):
new_dict = dict()
pc_dict = calculate_area(fl)
for key in pc_dict:
if key not in new_dict:
new_dict[key] = 0
new_dict[key] = float(sum(pc_dict[key]))
full_pc_dict[fl] = new_dict
frames_list = [0, 1, 2, 3, 4, 5, 6]
我想为frames_list
中的每一帧process_frame
.
请注意,最终结果应是一个包含process_frame
的所有输出的字典。我不知道在函数末尾附加它是否是一个好主意。
关于如何使用Jupyter Notebook执行此操作的任何建议?另外,是否可以让tqdm
使用此并行处理?
亲切问候
[更新]
如果要在 jupyter 笔记本中使用多处理,则希望使用多进程包而不是内置multiprocessing
(Jupyter 笔记本与多处理的主功能存在已知问题(
使用魔术函数创建一个单独的.py
文件。如果要在笔记本中执行此操作 - 请在单独的代码单元格中使用如下所示的内容:
%%writefile magic_functions.py
def magic_function(f):
return f+10
def process_frame(f):
# changed your logic here as I couldn't repro it
return f, magic_function(f)
出:写作magic_functions.py
然后并行运行代码:
from tqdm import tqdm
from multiprocess import Pool
from magic_functions import process_frame
frames_list = [0, 1, 2, 3, 4, 5, 6]
max_pool = 5
with Pool(max_pool) as p:
pool_outputs = list(
tqdm(
p.imap(process_frame,
frames_list),
total=len(frames_list)
)
)
print(pool_outputs)
new_dict = dict(pool_outputs)
print("dict:", new_dict)
外:
100%|████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:00<00:00, 37.63it/s]
[(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16)]
dict: {0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16}