2011-10-20 2 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 = 딕셔너리 [0]과 같이 해석되어, ..day1value dict [1] ... 등. 기본적으로 서로에 대해 두 개의 사전을 비교하려고합니다. 그래서 큐는 모든 엔트리를 함께 묶는 중첩 된 for 루프에서 온 것입니다. (큐에 추가하면 모든 CPU에서 처리됩니다. 현재 개별적으로 작동하지만 하나의 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 안녕하세요. 댓글을 남깁니다. 나는 메시지로 질문을 갱신했다. 희망이 도움이됩니다. – Lostsoul

+0

우리는'rules'의 본문을 볼 필요가 있습니다. 전달되고있는 항목에 대해 색인을 생성하려고 시도하는 것처럼 보이는데 작동하지 않습니다. –

답변

2

이 줄 TypeError: 'Queue' object does not support indexing은 변수의 dict 변수를 나타내는 것입니다 (아마도 원하지 않을 것입니다). 줄을 두 번 확인하여 최대 dict 변수를 올바르게 할당했는지 확인하십시오. 또한


, 변수 이름으로 형명을 사용하지 마십시오. dict이 유형이므로 사전 변수의 이름으로 사용해서는 안됩니다. my_dict 또는 비슷한 것을 사용하십시오. dict을 변수 이름으로 사용하면 dict 변수의 값을 할당하는 대신 dict 객체에 다른 변수를 설정하는 것이 가능합니다.

dict 클래스에 대한 자세한 내용은 stdtypes을 참조하십시오.


을 Heres 문제는, 당신은 어떤 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] 
+0

답변을 주셔서 감사합니다.하지만 미안 해요. 무엇을해야할지 잘 모르겠어요. 귀하의 논리를 이해하고 나는 command : tasks = multiprocessing.Queue() 및 tasks.put (rulesDataToPass)이 이렇게 만들고 있다고 생각하지만 해결 방법을 모르겠습니다. 내 추론 내 기능 목록을 소요했다 (I 잘못이 dict..I 그 변경 표시)하지만 난 전달되는 큐에 내 목록을 추가해야합니다 그래서 모든 목록이 너무 내 CPU 근로자를 처리 할 수있는 대기 할 (목록을 기대하는) 함수에. 큐를 통해 목록에 함수를 전달하려면 어떻게해야합니까? – Lostsoul

+0

죄송합니다. 혼란스럽게 작성한 경우 .. 대기열을 통해 함수에 데이터를 보내는 것에 대해 혼란스러워합니다. 예제를 작성했는데 하나의 변수 만 보낼 수는 있지만 목록을 보내는 방법은 확실하지 않습니다. 목록을 사용하기 전에 함수에 6 개의 변수를 전송했지만 대기열에서이를 거부했습니다. – Lostsoul

+0

코드가 상당히 큽니다 (400+ 회선) 그리고 많은 양의 데이터가 생성되므로 정상적인 컴퓨터에서 실행하는 데 시간이 오래 걸립니다. 내 노트북과 데스크톱에서 며칠이 걸리기 때문에 코드를 실행하는 서버가 있습니다. 게다가 나는 초보자이고 아무도 내 뒤틀린 논리를 따라갈 수 없을 것이라고 생각한다. (나는 때때로조차 할 수 없다.) 기본적으로 위의 코드는 대기열없이 작동하지만 대기열에 처리 할 목록을 보내는 방법을 잘 모르는 것 같습니다. '큐'개체가 다시는 내 편집을 확인 색인 – Lostsoul

관련 문제