字典的多处理列表不会同时处理重复的键值对



我是多处理的新手,遇到了一个无法解决的问题。我有一个类似的字典列表(还有更多的字典(,它们有重复的"设备名称"键和值对(即-'device_name': 'name1'(:

DEVICE_LIST = [{'device_name': 'name1', 'config': '!nint  Gi1/0/10n des TEST INT DESCn!', 'job_id': 1, 'hostname': 'name1.device.com', 'ip': '1.1.1.1', 'ping_result': 'UP'}, {'device_name': 'name2', 'config': '!nint  Gi1/0/10n des TEST INT DESCn!', 'job_id': 1, 'hostname': 'name2.device.com', 'ip': '2.2.2.2', 'ping_result': 'UP'},  {'device_name': 'name1', 'config': '!nint  Gi1/0/11n des TEST INT DESCn!', 'job_id': 1, 'hostname': 'name1.device.com', 'ip': '1.1.1.1', 'ping_result': 'UP'}]

我将字典发送给一个函数,该函数登录到设备并执行配置更改并捕获与该事务相关的数据。目前,我正在使用pool.map向函数发送列表,如下所示:

import multiprocessing.dummy as mp
# Set pool size
pool = mp.Pool(10)
# Send the device list to the function using
CONFIG_RESULTS = pool.map(config_function, DEVICE_LIST)

我想实现的是,如果已经在处理键、值对'device_name': 'name1',则在第一个实例完成之前不要处理'device_name': 'name1'的任何其他实例,因为我不希望在同一设备上同时发生两个配置活动。有什么想法吗?

使用quamrana的建议和"groupby"方法(我还不太清楚(使其发挥作用。

DEVICE_LIST = [{'device_name': 'name1', 'config': '!nint  Gi1/0/10n des TEST INT DESCn!', 'job_id': 1, 'hostname': 'name1.device.com', 'ip': '1.1.1.1', 'ping_result': 'UP'}, {'device_name': 'name2', 'config': '!nint  Gi1/0/10n des TEST INT DESCn!', 'job_id': 1, 'hostname': 'name2.device.com', 'ip': '2.2.2.2', 'ping_result': 'UP'},  {'device_name': 'name1', 'config': '!nint  Gi1/0/11n des TEST INT DESCn!', 'job_id': 1, 'hostname': 'name1.device.com', 'ip': '1.1.1.1', 'ping_result': 'UP'}]
def device_list_processing(list_in):
# Create list to store each device config job result
device_results = []
# For each device job in the list pass to 'config_function' to run config job
for job in list_in:
device_results.append(config_function(job))
return device_results

# Create lists of config jobs grouped by device_name to avoid multiple configs on the same device at the same time
GROUPED_LIST = []
for _, g in groupby(sorted(DEVICE_LIST, key=lambda k: k["device_name"]), lambda k: k["device_name"]):
GROUPED_LIST.append(list(g))
# Send the lists of config jobs grouped by device to the list processing function
pool = mp.Pool(10)
GROUPED_RESULTS = pool.map(device_list_processing, GROUPED_LIST)

最新更新