0

私は次の方法を持っています:

def GetMarketData(fr, cr, dct1, dct2, dict3, dct5, dct5):
    md = MarketData()

    q1 = Queue()
    q2 = Queue()
    q3 = Queue()
    q4 = Queue()
    q5 = Queue()
    q6 = Queue()
    q7 = Queue()
    p1 = Process(target=md.GetMD1, args=(q1,))
    p2 = Process(target=md.GetMD2, args=(q2,))
    p3 = Process(target=md.GetMD3, args=(q3,))
    p4 = Process(target=md.GetMD4, args=(q4,))
    p5 = Process(target=md.GetMD5, args=(q5,))
    p6 = Process(target=md.GetMD6, args=(q6,))
    p7 = Process(target=md.GetMD7, args=(q7,))
    p1.start()
    p2.start()
    p3.start()
    p4.start()
    p5.start()
    p6.start()
    p7.start()
    fr.append(q1.get())
    dct1.update(q2.get())
    dct2.update(q3.get())
    dct3.update(q4.get())
    cr.append(q5.get())
    dct4.update(q6.get())
    dct5.update(q7.get())
    p1.join()
    p2.join()
    p3.join()
    p4.join()
    p5.join()
    p6.join()
    p7.join()

    #print "good"

これをできるだけ数行で書き直す良い方法はありますか。各キューで同じプロセスを開く必要がある場合は問題ありませんが、いくつかの異なるプログラムを並行して実行する必要があり、これをより少ない行で書き直す方法がわかりません...

ありがとう !!!

4

2 に答える 2

1

それ以外の:

q1 = Queue()
q2 = Queue()
q3 = Queue()
q4 = Queue()
q5 = Queue()
q6 = Queue()
q7 = Queue()

代わりに次のように書くことができます:

queues = [Queue() for i in xrange(7)]

これで、キューがqueues[0]通過しqueues[6]ました。プロセスでも同じことができます。

processes = [Process(target=getattr("md.GetMD%d" % (i+1)), args=(queues[i],))
             for i in xrange(7)]

そして、ループを使用してそれらを開始します。

for process in processes:
    process.start()

後で参加する場合も同様です。

for process in processes:
    process.join()

それはこのセクションを残します:

fr.append(q1.get())
dct1.update(q2.get())
dct2.update(q3.get())
dct3.update(q4.get())
cr.append(q5.get())
dct4.update(q6.get())
dct5.update(q7.get())

名前付き引数ではなく、関数で任意の数の引数を受け入れるだけで、同様の方法でループ化できます。次に、引数をループできます。

for queue, result_dict in zip(queues, result_dicts):
    result_dict.update(queue.get())

次に、任意の数の辞書を渡すようにすることもできます。したがって、魔法の数を使用するのではなく、7引数と同じ数のキューとプロセスを作成するだけです。関数は、一部のディクショナリが他のディクショナリと異なることを知る必要はありません。実際、これらのディクショナリはすべて同じように処理されるためです。

まとめると、次のようになります。

def GetMarketData(*result_dicts):

    queues = [Queue() for item in result_dicts]

    processes = [Process(target=getattr("md.GetMD%d" % (i+1)), args=(queues[i],))
                 for i in xrange(len(result_dicts))]

    for process in processes:
        process.start()

    for queue, result_dict in zip(queues, result_dicts):
        result_dict.update(queue.get())

    for process in processes:
        process.join()

(関連のないメモ: 私はあまり を使っmultiprocessingたことがありませんがjoin、キューから読み取る前にプロセスを実行して、キュー内の結果が完全であることを確認したくありませんか?)

于 2013-05-06T16:10:55.847 に答える