【发布时间】:2019-08-29 10:48:17
【问题描述】:
我正在多个进程上运行一个函数,该函数将大熊猫数据帧的字典作为输入。启动进程时,将字典复制到每个进程,但据我了解,字典仅包含对数据帧的引用,因此数据帧本身不会复制到每个进程。这是正确的,还是每个进程都会获得字典的深层副本?
import numpy as np
from multiprocessing import Pool, Process, Manager
def process_dataframe(df_dict, task_queue, result_queue):
while True:
try:
test_value = task_queue.get(block=False)
except:
break
else:
result = {df_name: df[df==test_value].sum() for df_name, df in df_dict.items()}
result_queue.put(result)
if __name__ == '__main__':
manager = Manager()
task_queue = manager.Queue()
result_queue = manager.Queue()
df_dict = {'df_1': some_large_df1, 'df_2': some_large_df2, ...}
test_values = np.random.rand(1000)
for val in test_values:
task_queue.put(val)
with Pool(processes=4) as pool:
processes = []
for _ in range(4):
# Is df_dict copied shallow or deep to each process?
p = pool.Process(target=process_dataframe, args=(df_dict,task_queue,result_queue))
processes.append(p)
p.start()
for p in processes:
p.join()
results = [result_queue.get(block=False) for _ in range(result_queue.qsize())]
【问题讨论】:
-
你在哪里复制它?
df_dict永远不会被复制。我看到它作为参数传递给pool.Process... 因为它是作为参数传递的,所以整个dict作为指针传递。所以即使是浅拷贝也不会发生。 -
出于这个原因,您还应该使您的
dict线程安全。 -
@Error-SyntacticalRemorse 我在某处读到,参数在发送到每个进程之前被腌制。那么只有指针会被腌制吗?
标签: python-3.x