2010-05-25 4 views
0

У меня есть простой алгоритм сокращения типа карты, который я хочу реализовать на python и использовать несколько ядер.Сложность с использованием несовместимого python, не могу записать в dict

Я где-то читал, что потоки, использующие собственный поточный модуль в 2.6, не используют несколько ядер. это правда?

Я даже реализовать его с помощью Stackless Python, однако я получаю в странные ошибки [Update: быстрый поиск показал, что стек меньше не позволяет использовать несколько ядер поэтому их любые другие альтернативы?]

def Propagate(start,end): 
print "running Thread with range: ",start,end 
def maxVote(nLabels): 
    count = {} 
    maxList = [] 
    maxCount = 0 
    for nLabel in nLabels: 
     if nLabel in count: 
      count[nLabel] += 1 
     else: 
      count[nLabel] = 1 
    #Check if the count is max 
     if count[nLabel] > maxCount: 
      maxCount = count[nLabel]; 
      maxList = [nLabel,] 
     elif count[nLabel]==maxCount: 
      maxList.append(nLabel) 
    return random.choice(maxList)   

for num in range(start,end): 
    node=MapList[num] 
    nLabels = [Label[k] for k in Adj[node]] 
    if (nLabels!=[]): 
     Label[node] = maxVote(nLabels) 
    else: 
     Label[node]=node 

Однако в приведенном выше коде значения, присвоенные Label, то есть изменение словаря, теряются.

функции Над размножать используется как вызываемая для микронитей (т.е. Tasklets)

ответ

1

Используйте multiprocessing модуль стандартной библиотеки - он имитирует интерфейс threading модуля (чтобы облегчить перенос существующего многопоточного кода) и может полностью используйте все имеющиеся у вас сердечники. Threading и Stackless являются одноядерными (и, действительно, stackless не является превентивным, поэтому программирование для него совершенно отличается от программирования для потоковой обработки или многопроцессорности).

+0

В частности, multiprocessing.map() является _incredibly_ полезным. – carl