2016-04-25 3 views
3

私は3つの関数を持ち、それぞれがリストを返します。問題は、各機能の実行に20-30秒ほどかかることです。スクリプト全体を実行すると、約2分かかります。同時に3つの関数を実行する方法(およびそれぞれから値を返す方法)

3つの機能を同時に実行するには、マルチプロセッシングまたはマルチスレッド化(いずれか実装が簡単な方)を使用します。

私が遭遇したもう一つのハードルは、私が各機能からリストを返す方法がわからないということでした。

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() 

私はこれらの三つの機能を同時に実行しなければならないのは?

+1

:私は、マルチプロセッシング・パターンにコードを適応しています。これらのテンプレートに従ってみて、特定の問題と試した内容で投稿を更新する必要があります。 – ChrisP

答えて

0

スレッドライブラリをお試しください。

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() 

限りその戻り値を取得するよう、あなたには、いくつかのクラス関数にrecommonへの呼び出しをラップし、それらをメンバ変数に結果を保存可能性があります。または、いくつかのローカル関数でrecommonへの呼び出しをラップし、変更可能なオブジェクト(リストまたは辞書)を関数に渡し、その関数がその変更可能なオブジェクトを変更するようにすることができます。

または、他の人が述べたように、multiprocessingはあなたが望むことをする良い方法です。

1

私はコードの残りの部分を持っていないので、これは完全にテストされていませんが、何ができるかをあなたに知らせるかもしれません。 [ `multiprocessing`のドキュメント](https://docs.python.org/3.5/library/multiprocessing.html)はサンプルコードがたくさんあり

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() 
関連する問題