2011-10-20 11 views
2

キュー/マルチプロセッシングを使用して奇妙なエラーが発生しました。私は基本的にリストを取り、それを解析する関数を持っています。マルチプロセッシングキューモジュール経由で関数にリストを渡す際にエラーが発生しました

私はこれを何度もやらなければならないので、私はそれをコアに広げてキューをセットアップしようとしましたが、動作しません。ここに私のコード:

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

私は間違っているのか分かりません。キューを使用せずに正常に動作します。問題は私の関数が複数の変数を実行する必要があることです(個別に送信する前に、すべてまとめてリストにまとめてキューに入れることにしました)。

助けてください!

ありがとうございます!

UPDATE:要求されたように、ここでトレースバックである:

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 

基本的に、私は「ルール」と呼ばれている関数にデータを送信している、辞書は、次にday1Count = dictのように解析される[0]、 ..day1value dict [1] ...など。私は基本的に2つの辞書を互いに比較しようとしています。キューはすべてのエントリをまとめてネストされたforループからのものです(キューに追加すると、すべてのCPU上で処理されます.1つは個別に動作しますが、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) 

の値をとり、その後、他の関数に渡します。

+0

は、あなたが実行し得る例外メッセージとトレースバックを含むことができ、スクリプト? – chown

+0

@chown Hey ..コメントの感謝。メッセージで質問を更新しました。希望が役立ちます。 – Lostsoul

+0

私たちは 'rules'の本体を見る必要があります。あなたに渡されているものにインデックスをつけようとしているようですが、これはうまくいきません。 –

答えて

2

この行TypeError: 'Queue' object does not support indexingは、お客様のdict変数のタイプがQueueであることを示しています(これはおそらくその必要はありません)。行をダブルチェックして、dict変数が適切に正しく割り当てられていることを確認してください。


また、NEVERは、変数名としてタイプ名を使用します。 dictは型ですが、辞書変数の名前として使用しないでください。 my_dictなどを使用してください。変数名としてdictを使うと、dict変数の値を代入するのではなく、他の変数をdictオブジェクトに設定することが可能です。

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

相続人

問題、反復可能なタイプ(リスト)期待されるrules()からQueueあるご送信tasks、:

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] 
+0

お返事ありがとうございます。申し訳ありませんが、私は本当に何をすべきか分かりません。あなたのロジックは理にかなっていて、私はコマンド:task = multiprocessing.Queue()とtasks.put(rulesDataToPass)はこのようにしていると思いますが、どのように修正するのか分かりません。 私の推論は、私の関数はリストを取ることです(私は間違ってそれをdict ..私はそれを変更しました)が、私のCPUの作業者がそれを処理できるようにすべてのリストをキューに入れたいので、 (リストを期待している)関数に渡します。キューからその関数にリストを渡すにはどうすればよいですか? – Lostsoul

+0

申し訳ありませんが、私は混乱した方法で書きました。私は、キューを介して関数にデータを送ることについて混乱しています。私は例を実行して、単一の変数を送ることができますが、リストを送信する方法はわかりません。リストを使用する前に、関数に6つの変数を送信していましたが、キューはそれを拒否しました。 – Lostsoul

+0

コードはかなり大きく(400+行)、多くのデータが生成され、通常のマシンで実行するには時間がかかります。ノートパソコンとデスクトップで数日かかるので、コードを実行しているサーバーがあります。プラス私は初心者であり、私は誰も私のねじれたロジック(私も時々できることはありません.Lol)に従うことができると思います。基本的に上記のコードはキューなしで動作しますが、処理するキューにリストを送信する方法がわかりません。 – Lostsoul

関連する問題