这是一个从YAML文件创建的列表。我想将每个memservers的以下内容与列表中的其他merserver进行比较:
- 如果rpc_interface相同
- 如果rpc_interface相同,fam_path是否相同? 如果rpc_interface是相同的,libabric_port是相同的吗?
代码应该是通用的,也就是说,它应该适用于任何数量的服务器。
provider: sockets
delayed_free_threads: 0
ATL_threads: 0
ATL_queue_size: 1000
ATL_data_size: 1024
Memservers:
0:
memory_type: volatile
fam_path: /dev/shm/vol_path
rpc_interface: fam5:8793
libfabric_port: 7500
if_device: eth0
1:
memory_type: volatile
fam_path: /dev/shm/vol_path
rpc_interface: fam4:8793
libfabric_port: 7500
if_device: eth1
2:
memory_type: volatile
fam_path: /dev/shm/vol_path
rpc_interface: fam3:8793
libfabric_port: 7500
if_device: eth1
对于您的每个需求,您应该只映射值(不应该重复)到你找到他们的机器号码。在下面刚刚完成的第一个需求:
from pathlib import Path
import ruamel.yaml
host_port = {}
file_in = Path('fam_memoryserver_config.yaml')
yaml = ruamel.yaml.YAML(typ='safe') # faster than using yaml.safe_load()
data = yaml.load(file_in)
for machine_nr, config in data.items():
host_port.setdefault(config['rpc_interface'], set()).add(machine_nr)
# now check if host_port has any values that have more than one machine_nr
for hp, machine_nrs in host_port.items():
if len(machine_nrs) == 1:
continue
print(f'found {hp} in machines: {", ".join([str(x) for x in machine_nrs])}')
给了:
found fam3:8793 in machines: 1, 2
你应该把术语弄清楚,或者至少在你的问题中定义这些术语。常见的术语会帮助你自己更容易地找到答案(这里是SO,或者谷歌)。
你没有任何列表,你有一个映射YAML文档的根级别,并映射每个键的值。它们加载到字典内嵌套的字典中。没有列表.
上面还假设键rpc_interfaces
的值是您所引用的值ip:port
,然而fam5:8793
中:
之前的部分看起来不像IPv4或IPv6地址。它看起来更像主机名。
你也提到和之间的检查文件,但是只有两个文件:YAML输入和源代码。比较它们没有多大意义。