python - マルチプロセッシングキューモジュールを介して関数にリストを渡すときにエラーが発生しました

python

キュー/マルチプロセッシングを使用すると、奇妙なエラーが発生します。基本的に、リストを取得してそれを解析する関数があります。

私はこれを何度も行わなければならないので、私が持っているコアにそれを広げることは良い考えだと思い、キューをセットアップしようとしましたが、機能しません。これが私のコードです:

# Establish communication queues
tasks = multiprocessing.Queue()

# Start consumers
num_consumers = multiprocessing.cpu_count() * 2
print 'Creating %d consumers' % num_consumers
worker = [ rules(tasks)
          for i in xrange(num_consumers) ]
for w in consumers:
    w.start()


def loadGraph(dayCurrent, day2Previous):



for dayCurrentCount  in graph[dayCurrent]:
    dayCurrentValue = graph[dayCurrent][dayCurrentCount]
    for day1Count  in graph[day2Previous]:
        day1Value = graph[day2Previous][day1Count]
        rulesDataToPass = [day1Count, day1Value, dayCurrentCount, dayCurrentValue, dayCurrent, day2Previous]

        tasks.put(rulesDataToPass)



tasks.close()
tasks.join_thread()


何が悪いのかわかりません。キューを使用しなくても正常に動作します。問題は、私の関数を実行するために複数の変数を必要とすることです(個別に送信する前に、リストとしてまとめてそれをキューに入れることができるようにすることにしました)。

助けてください!

前もって感謝します!

更新:要求に応じて、ここにトレースバックがあります:

Traceback (most recent call last):
  File "/Users/lostsoul/Dropbox/code/learning/python/game.py", line 213, in <module>
    for i in xrange(num_consumers) ]
  File "Users/lostsoul/Dropbox/code/learning/python/game.py", line 191, in rules
    day1Count = dict[0]
TypeError: 'Queue' object does not support indexing


基本的に、「ルール」と呼ばれる関数にデータを送信します。次に、dictはday1Count = dict [0]、.. day1value dict [1] ...などのように解析されます。基本的に、2つの辞書を比較しようとしています互いに対して。したがって、キューはすべてのエントリを一緒にペアにするネストされたforループからのものです(これをキューに追加すると、すべてのCPUで処理されます。今すぐ個別に動作しますが、1つのCPUを使用して15分かかります)。

UPDATE2:これはルール関数です。それは簡単です。基本的に値を受け取り、それらを他の関数(ルールエンジンの私のバージョン)に渡します。

def rules(dict):
    day1Count = dict[0]
    day1Value = dict[1]
    dayCurrentCount = dict[2] 
    dayCurrentValue = dict[3] 
    dayCurrent = dict[4] 
    day2Previous = dict[5]
    exactSame(day1Count, day1Value, dayCurrentCount, dayCurrentValue, dayCurrent, day2Previous)
    withinFivePercentChange(day1Count, day1Value, dayCurrentCount, dayCurrentValue, dayCurrent, day2Previous)
    deleteNonEdgeNodes(dayCurrentCount, dayCurrentValue, dayCurrent)


キューがない場合、これは正常に機能します。
答え
この行TypeError: 'Queue' object does not support indexingは、dict変数のタイプがQueueであることを示しています(おそらくそうしたくないはずです)。 191行目以降をダブルチェックして、dict変数が正しく割り当てられていることを確認します。



また、型名を変数名として使用しないでください。 dictは型です。辞書変数の名前として使用しないでください。 my_dictまたは同様のものを使用します。 dictを変数名として使用することにより、dict変数の値を割り当てる代わりに、他の変数をdictオブジェクトに設定することが可能です。

stdtypesクラスの詳細については、dictを参照してください。



問題は次のとおりです。tasksへのQueueである送信rules()は、反復可能なタイプ(リスト)を期待しています。

tasks = multiprocessing.Queue()
worker = [rules(tasks) for i in xrange(num_consumers)]

def rules(dict):
    day1Count = dict[0]
    day1Value = dict[1]
    dayCurrentCount = dict[2] 
    dayCurrentValue = dict[3] 
関連記事

python - Python + Cairo + GTK / GDKピクセルバッファーの簡単なセットアップ

python - JavaScriptを介してMongoインデックスを追加する

python - タブ化された一連のQDockWidgetのトップQDockWidgetを設定する

python - あるプログラムから別のプログラムでstdoutを読み取る

python - Pythonで数値を分割する方法の数

python - pythonはhtmlフォームからファイルを受け取ります

python - PyDevを使用してPythonで変数アクセスにブレークポイントを設定する方法はありますか?

python - ターゲット関数が完了した後にPythonスレッドが確実に終了するようにするにはどうすればよいですか?

python - django / python:複数のテーブルを持つ生のSQL

python - ブレンダーは頂点ごとのUV座標をエクスポートできますか?