2017-04-11 70 views
0

後重置屬性的值我有元素〜100000的大名單,需要如下圖吧:Mongoengine文檔多處理地圖

def mark_diff(args): 
    item = args[0] 
    pi = args[1] 
    item.marked_diff = (item.p/pi[0]+item.c/pi[1]+item.f/pi[2] - 3)**2 
    return item 

def mark(f_set , goal): 
    with Pool(3) as p: 
     data = p.map(mark_diff , zip(f_set , itertools.repeat(goal))) 
    return data 

item.markded_diff的默認值是0,並且itemmongoengine document

我正在訴諸多處理,因爲mark_diff比這裏顯示的要複雜得多,而且涉及很多指數,我使用的是numpy的對數。

現在的問題,

返回data仍然有item.marked_diff0。 雖然如果我在mark_diff的底部添加打印語句,正在分配正確的值並且不爲零。

item的定義。

import random,mongoengine 
    class F(mongoengine.Document): 
     p = mongoengine.FloatField() 
     c = mongoengine.FloatField() 
     f = mongoengine.FloatField() 
     marked_diff = 0 
    f_sets = F.objects.all()  
    goal = [0.2,0.35,0.45] 

回答

1

所以有些事情正在發生什麼,你沒有表演。當我把它寫成一個完整的可執行程序時,它似乎工作正常。下面是一個運行下的Python 3.6.1輸出:

0.7024116548559156 
13.468354599594324 
6.036133666404753 
0.16520292241977205 
0.17073749475275496 
1.903674418518389 
0.2432159511273063 
7.743326563037492 
4.1990243814914425 
19.36243187965931 

下面是完整的程序:

from multiprocessing import Pool 
import random 
import itertools 

class F: 
    def __init__(self): 
     self.p = random.random() 
     self.c = random.random() 
     self.f = random.random() 

def mark_diff(args): 
    item = args[0] 
    pi = args[1] 
    item.marked_diff = (item.p/pi[0]+item.c/pi[1]+item.f/pi[2] - 3)**2 
    return item 

def mark(f_set , goal): 
    with Pool(3) as p: 
     data = p.map(mark_diff , zip(f_set , itertools.repeat(goal))) 
    return data 

if __name__ == "__main__": 
    f_set = [F() for _ in range(10)] 
    goal = [0.2,0.35,0.45] 
    xs = mark(f_set, goal) 
    for x in xs: 
     print(x.marked_diff) 

有沒有可能是你在原來的f_set在看marked_diff,而不是物品返回mark()

+0

在實際應用程序中,對象'F'是mongoengine文檔的一個實例。 'mark_diff'中的計算結果是正確的,因爲當我在'mark_diff'的底部輸出'item.marked_diff'時,它會顯示期望值。我檢查了,是的,我正在查看從'mark_diff'返回的值。 –

+1

我剛纔證明它對您發佈的代碼正常工作。我發佈的代碼是否也適合你?如果是這樣,那麼代碼中沒有_general_問題 - 在這種情況下,它可能是一個非常特定於「mongoengine文檔」在Python pickle協議下行爲的實現問題。在這種情況下,這與醃製有關,而不是真正的多處理。但是如果你沒有發佈其他人實際上失敗的代碼,所有其他人都可以盲目猜測。 –

+0

我剛剛在mongoengine模型定義中將'marked_diff'添加爲'FloatField'。它現在有效。我將使用mongoengine模型的上下文來更新這個問題,以便可以理解問題是mongoengine文檔。爲什麼它的行爲如此,我仍然想知道。 –