繁体   English   中英

通过数组加速迭代?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM