【发布时间】:2019-09-14 07:34:40
【问题描述】:
我正在对一个 api 进行超过 100K 次调用,使用 2 个函数我使用第一个函数访问 api 并获取每个主机的 sysinfo(a dict),然后使用第二个函数通过 sysinfo 并获取IP 地址。我正在寻找一种方法来加快速度,但之前从未使用过多处理/线程(目前大约需要 3 小时)。
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool
#pool = ThreadPool(4)
p = Pool(5)
#obviously I removed a lot of the code that generates some of these
#variables, but this is the part that slooooows everything down.
def get_sys_info(self, host_id, appliance):
sysinfo = self.hx_request("https://{}:3000//hx/api/v3/hosts/{}/sysinfo"
return sysinfo
def get_ips_from_sysinfo(self, sysinfo):
sysinfo = sysinfo["data"]
network_array = sysinfo.get("networkArray", {})
network_info = network_array.get("networkInfo", [])
ips = []
for ni in network_info:
ip_array = ni.get("ipArray", {})
ip_info = ip_array.get("ipInfo", [])
for i in ip_info:
ips.append(i)
return ips
if __name__ == "__main__":
for i in ids:
sysinfo = rr.get_sys_info(i, appliance)
hostname = sysinfo.get("data", {}).get("hostname")
try:
ips = p.map(rr.get_ips_from_sysinfo(sysinfo))
except Exception as e:
rr.logger.error("Exception on {} -- {}".format(hostname, e))
continue
#Tried calling it here
ips = p.map(rr.get_ips_from_sysinfo(sysinfo))
我必须经历超过 100,000 次这样的 api 调用,而这确实是减慢一切的部分。
我想我已经尝试了所有方法并得到了所有可能的可迭代、缺少参数的错误。
我真的很感激任何类型的帮助。谢谢!
【问题讨论】:
-
你得到有效的结果了吗?您可能想尝试concurrent.futures 模块 - 它有一个不错的 api。 ... 为什么你的函数有
self参数? -
这两个函数是一个类的一部分,整个程序确实给了我准确的结果,但它需要的时间太长了。我见过的所有简单示例似乎都有他们经过的列表......
-
你能从 api 中得到
sysinfo并在一个函数中提取你想要的数据吗?以便您可以在每个主机名上调用/映射该单个函数?或者你知道瓶颈是否只是 api 调用,sysinfo.get("data", {}).get("hostname")是一个相当快的过程? -
是的...我们确实考虑过这一点,我们将在未来的项目中从 sysinfo 中获取其他信息,但我今晚回家后会尝试。
-
你的外部循环(在
ids,不管是什么)是串行的,所以除非在get_sys_info上花费的时间很少,否则你无法加快速度。
标签: python multithreading dictionary multiprocessing