Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何同时运行三个函数(并从每个函数返回值)?_Python_Multithreading - Fatal编程技术网

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

Python 如何同时运行三个函数(并从每个函数返回值)?,python,multithreading,Python,Multithreading,我有三个函数,每个函数返回一个列表。问题是运行每个函数大约需要20-30秒。因此,运行整个脚本最终需要大约2分钟 我希望使用多处理或多线程(以较容易实现的为准)使这三个函数同时运行 我遇到的另一个障碍是我不确定如何从每个函数返回列表 def main(): masterlist = get_crs_in_snow() noop_crs = get_noops_in_snow() made_crs = get_crs_in_git() # take the pro

我有三个函数,每个函数返回一个列表。问题是运行每个函数大约需要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()

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

试试线程库

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()
至于获取它们的返回值,您可以在一些类函数中包装对recomon的调用,并让它们将结果保存到成员变量中。或者,您可以将recommon调用封装在一些本地函数中,只需将可变对象(列表或字典)传递给函数,并让函数修改该可变对象


或者,正如其他人所说,这可能是一种很好的方法来做你想做的事情。

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

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()
有很多示例代码。您应该尝试遵循这些模板,并用特定问题和您尝试的内容更新您的帖子。