如何同时运行三个函数(并从每个函数返回值)



我有三个函数,每个函数返回一个列表。 问题是运行每个函数大约需要 20-30 秒。 因此,运行整个脚本最终需要大约 2 分钟。

我想使用多处理或多线程(以更容易实现者为准)同时运行所有三个函数。

遇到的另一个障碍是我不确定如何从每个函数返回列表。

def main():
    masterlist = get_crs_in_snow()
    noop_crs = get_noops_in_snow()
    made_crs = get_crs_in_git()
    # take the prod master list in SNOW, subtract what's been made or is in the noop list
    create_me = [obj for obj in masterlist if obj not in made_crs and obj not in noop_crs]
    print "There are {0} crs in Service Now not in Ansible".format(len(create_me))
    for cr in create_me:
        print str(cr[0]),

if __name__ == '__main__':
    main()

我想我可以通过多线程或多处理以下行来获得一些显着的运行时改进:

masterlist = get_crs_in_snow()
noop_crs = get_noops_in_snow()
made_crs = get_crs_in_git()

如何让这三个函数同时运行?

这是完全未经测试的,因为我没有你的其余代码,但它可能会让你知道可以做什么。我已经将您的代码改编为多处理模式:

from multiprocessing import Pool
def dispatcher(n):
    if n == 0:
        return get_crs_in_snow()
    if n == 1:
        return get_noops_in_snow()
    if n == 2:
        return get_crs_in_git()
def main():
    pool = Pool(processes=3)
    v = pool.map(dispatcher, range(3))
    masterlist = v[0]
    noop_crs = v[1]
    made_crs = v[2]
    # take the prod master list in SNOW, subtract what's been made or is in the noop list
    create_me = [obj for obj in masterlist if obj not in made_crs and obj not in noop_crs]
    print "There are {0} crs in Service Now not in Ansible".format(len(create_me))
    for cr in create_me:
        print str(cr[0]),

if __name__ == '__main__':
    main()

尝试线程库。

import threading
threading.Thread(target=get_crs_in_snow).start()
threading.Thread(target=get_noops_in_snow).start()
threading.Thread(target=get_crs_in_git).start()

就获取它们的返回值而言,您可以将调用包装在某些类函数中以重新通用,并让它们将结果保存到成员变量中。或者,您可以将调用包装在某些本地函数中以重新通用,并简单地将可变对象(列表或字典)传递给函数,并让函数修改该可变对象。

或者,正如其他人所说,多处理可能是做你想做的事情的好方法。

最新更新