Python 迭代多个列表/目录的更有效方法?
我有一个脚本,我能够一起破解,并使工作 然而,我知道这是非常低效的,我肯定可以利用这一机会向其他人学习如何有效地处理这一问题 以下是您自己的代码:Python 迭代多个列表/目录的更有效方法?,python,performance,list,dictionary,Python,Performance,List,Dictionary,我有一个脚本,我能够一起破解,并使工作 然而,我知道这是非常低效的,我肯定可以利用这一机会向其他人学习如何有效地处理这一问题 以下是您自己的代码: # !/usr/bin/env python from __future__ import print_function from functools import wraps from pprint import pprint import sys import requests import datetime import acos_client
# !/usr/bin/env python
from __future__ import print_function
from functools import wraps
from pprint import pprint
import sys
import requests
import datetime
import acos_client as acos
import json
import influxdb
from influxdb import client as influxdb
# Define InfluxDB Client Information
db = influxdb.InfluxDBClient(host='127.0.0.1', port=8086, username='root', password='root', database='metrics')
# A10 ACOS Client single connection to LB01
# Look into a DICT/LIST of LB's that we could iterate through?
# Define details of LB01 Connection
c = acos.Client('10.10.10.1', acos.AXAPI_21, 'username', 'password')
# Define details of LB02 Connection
d = acos.Client('10.10.10.2', acos.AXAPI_21, 'username', 'password')
# Define a DICT/LIST of ServiceGroup names that we will pull stats for each LoadBalancer?
name = 'SG_ACCOUNT.BUSINESS.COM_443'
name2 = 'SG_ACCOUNT.BUSINESS.COM_80'
name3 = 'SG_ACCOUNT_MESSENGER_80'
name4 = 'SG_ACCOUNT_MESSENGER_81'
# These will poll LB01 with different ServiceGroup Names:
# Has to be a way to maybe iterate through a list of names?
data = c.slb.service_group.stats(name)
data2 = c.slb.service_group.stats(name2)
# These will poll LB02 with different ServiceGroup Names:
# Has to be a way to maybe iterate through a list of names?
data3 = d.slb.service_group.stats(name3)
data4 = d.slb.service_group.stats(name4)
# Take the data for LB01 and ServiceGroup tied to (name) and 'package' it up and send to InfluxDB
for server in data['service_group_stat']['member_stat_list']:
metricslist = []
metricsentry = {}
metricsentry['measurement'] = "LB01"
metricsentry['tags'] = {}
metricsentry['fields'] = {}
metricsentry['tags']['SGNAME'] = name
metricsentry['tags']['SRVNAME'] = server['server']
metricsentry['fields']['CURCONNS'] = server['cur_conns']
metricsentry['fields']['TOTCONNS'] = server['tot_conns']
metricsentry['fields']['REQBYTES'] = server['req_bytes']
metricsentry['fields']['REQPKTS'] = server['req_pkts']
metricsentry['fields']['RESPBYTES'] = server['resp_bytes']
metricsentry['fields']['RESPPKTS'] = server['resp_pkts']
metricslist.append(metricsentry)
# Write the list to InfluxDB
db.write_points(metricslist)
# Take the data for LB01 and ServiceGroup tied to (name2) and 'package' it up and send to InfluxDB
for server in data2['service_group_stat']['member_stat_list']:
metricslist2 = []
metricsentry = {}
metricsentry['measurement'] = "LB01"
metricsentry['tags'] = {}
metricsentry['fields'] = {}
metricsentry['tags']['SGNAME'] = name2
metricsentry['tags']['SRVNAME'] = server['server']
metricsentry['fields']['CURCONNS'] = server['cur_conns']
metricsentry['fields']['TOTCONNS'] = server['tot_conns']
metricsentry['fields']['REQBYTES'] = server['req_bytes']
metricsentry['fields']['REQPKTS'] = server['req_pkts']
metricsentry['fields']['RESPBYTES'] = server['resp_bytes']
metricsentry['fields']['RESPPKTS'] = server['resp_pkts']
metricslist2.append(metricsentry)
# Write the list to InfluxDB
db.write_points(metricslist2)
# Take the data for LB02 and ServiceGroup tied to (name3) and 'package' it up and send to InfluxDB
for server in data3['service_group_stat']['member_stat_list']:
metricslist3 = []
metricsentry = {}
metricsentry['measurement'] = "LB02"
metricsentry['tags'] = {}
metricsentry['fields'] = {}
metricsentry['tags']['SGNAME'] = name3
metricsentry['tags']['SRVNAME'] = server['server']
metricsentry['fields']['CURCONNS'] = server['cur_conns']
metricsentry['fields']['TOTCONNS'] = server['tot_conns']
metricsentry['fields']['REQBYTES'] = server['req_bytes']
metricsentry['fields']['REQPKTS'] = server['req_pkts']
metricsentry['fields']['RESPBYTES'] = server['resp_bytes']
metricsentry['fields']['RESPPKTS'] = server['resp_pkts']
metricslist3.append(metricsentry)
# Write the list to InfluxDB
db.write_points(metricslist3)
# Take the data for LB02 and ServiceGroup tied to (name4) and 'package' it up and send to InfluxDB
for server in data4['service_group_stat']['member_stat_list']:
metricslist4 = []
metricsentry = {}
metricsentry['measurement'] = "LB02"
metricsentry['tags'] = {}
metricsentry['fields'] = {}
metricsentry['tags']['SGNAME'] = name4
metricsentry['tags']['SRVNAME'] = server['server']
metricsentry['fields']['CURCONNS'] = server['cur_conns']
metricsentry['fields']['TOTCONNS'] = server['tot_conns']
metricsentry['fields']['REQBYTES'] = server['req_bytes']
metricsentry['fields']['REQPKTS'] = server['req_pkts']
metricsentry['fields']['RESPBYTES'] = server['resp_bytes']
metricsentry['fields']['RESPPKTS'] = server['resp_pkts']
metricslist4.append(metricsentry)
# Write the list to InfluxDB
db.write_points(metricslist4)
理想情况下,我希望能够遍历负载平衡器连接列表,即c和d acos.Client行
然后我想我会有多个服务组名称列表,这些名称必须与它们所在的LoadBalancer关联
我想你会有这样的想法:
LB01
SG1
SG2
LB02
SG3
SG4
连接到用于SG1的LB01下拉数据,将其格式化并发送到XDB
连接到用于SG2的LB01下拉数据,将其格式化并发送到XDB
继续循环通过与LB01相关的任何SG
然后对下一个负载平衡器LB02执行相同的操作
必须是一种利用一些列表或dict、迭代和更新XDB的方法,而无需每次重新创建太多代码
每个负载平衡器都有很多服务组,因此此代码无法扩展以适应具有更多服务组的负载平衡器
非常期待从中学习,因为它肯定会在未来的项目中派上用场。似乎有很多重复,可以抽象为几个函数。您还可以以内联方式建立列表/目录,并节省一些打字时间
def db_write_metrics(db, measurement, name, server):
metricslist = [
{
'measurement':measurement,
'tags':{
'SGNAME':name,
'SRVNAME':server['server']},
'fields':{
'CURCONNS':server['cur_conns'],
'TOTCONNS':server['tot_conns'],
'REQBYTES':server['req_bytes'],
'REQPKTS':server['req_pkts'],
'RESPBYTES':server['resp_bytes'],
'RESPPKTS':server['resp_pkts'],
}]
db.write_points(metricslist)
def db_write_metrics_list(db, data, measurement, name):
for server in data['service_group_stat']['member_stat_list']:
db_write_metrics(db, measurement, name, server)
现在,那些用于循环的
db_write_metrics_list(db, data, "LB01", name)
db_write_metrics_list(db, data2, "LB01", name2)
db_write_metrics_list(db, data3, "LB02", name3)
db_write_metrics_list(db, data4, "LB02", name4)
并且,假设不存在相互依赖性,这需要并行完成,您可以将它们放在线程池中
import multiprocessing.pool
pool = multiprocessing.pool.ThreadPool(4)
pool.map(db_write_metrics_list,
( (db, data, "LB01", name),
(db, data2, "LB01", name2),
(db, data3, "LB02", name3),
(db, data4, "LB02", name4)))
pool.close()
pool.join()
可能重复的井。如果这是在XDB的上下文中提出的,那肯定是一个相关的问题imho。我不确定你到底在问什么,但看看你的代码,你似乎可以通过创建一个用四组不同参数调用的函数来摆脱重复的代码。也就是说,传递一个数据值,一个名称,可能还有一个负载均衡器值,不管LB01和LB02是什么。我确实需要研究一下如何实现您所说的功能。似乎在每种情况下都有多个步骤需要迭代,作为新手,我很难做到这一点。我会继续尝试的哇!好的,这是非常有用的,我将继续努力实现这一点并进行测试。我可能会把多重处理留到以后。@martineau-我可能会有一些在那里。。。谢谢,我会修好的。这实际上效果很好,是一个巨大的进步。我真的想更加了解函数的定义和使用。仅仅这一点就产生了很大的不同。我仍然相信,对于如何定义与数据变量和负载平衡器连接相关的不同组,我可以做一些事情。我会继续思考,尝试不同的想法。