[英]Speed up iteration through an array?
我一直试图让这段代码运行得更快/更有效,但我似乎遇到了很多麻烦。
resp = {}
ipIter = iter(ipList)
#Check status of MineCraft Server
def checkStatus(ip):
try:
server = JavaServer.lookup(ip)
status = server.status()
q = server.query()
resp['Online'] = True
resp['address'] = ip
resp['players_online'] = q.players.names
resp['players_max'] = q.players.max
resp['version'] = status.version.name
resp['plugins'] = q.software.plugins
#with args.output as ofile:
print(json.dumps(resp))
except Exception as e:
print(f"Server {ip} is offline with error {str(e)}")
for x in range(len(ipList)):
checkStatus(next(ipIter))
我玩弄了使用多线程/多处理来帮助它运行得更快的想法,但我不确定这是否是最好的方法。 我已经尝试过很多不同的方法让它运行得更快,但到目前为止没有任何效果。
有什么我可以做得更好的吗?
澄清一下,我编写的与 api 挂钩的脚本可以在大约 15 分钟内运行约 428 个 IP 的列表。 我目前正在研究的那个大约每 10 秒执行 1 个 IP。 完成所有约 428 个 IP 需要一个多小时。
Python 带有一个基于线程的工作池实现, ThreadPool
:
from multiprocessing.pool import ThreadPool
def checkStatus(ip):
# exceptions will be logged to stderr - so, I'd skip printing
# make sure this call is thread-safe
server = JavaServer.lookup(ip)
status = server.status()
q = server.query()
return {
# 'Online': True, # perhaps not very helpful as only True is returned
'address': ip,
'players_online': q.players.names,
'players_max': q.players.max,
'version': status.version.name,
'plugins': q.software.plugins
}
# optionally, pass number of threads; using number of cores by default
tp = ThreadPool()
data = tp.map(checkStatus, ipList)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.