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
,並且item
是mongoengine document
。
我正在訴諸多處理,因爲mark_diff
比這裏顯示的要複雜得多,而且涉及很多指數,我使用的是numpy的對數。
現在的問題,
返回data
仍然有item.marked_diff
爲0
。 雖然如果我在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]
在實際應用程序中,對象'F'是mongoengine文檔的一個實例。 'mark_diff'中的計算結果是正確的,因爲當我在'mark_diff'的底部輸出'item.marked_diff'時,它會顯示期望值。我檢查了,是的,我正在查看從'mark_diff'返回的值。 –
我剛纔證明它對您發佈的代碼正常工作。我發佈的代碼是否也適合你?如果是這樣,那麼代碼中沒有_general_問題 - 在這種情況下,它可能是一個非常特定於「mongoengine文檔」在Python pickle協議下行爲的實現問題。在這種情況下,這與醃製有關,而不是真正的多處理。但是如果你沒有發佈其他人實際上失敗的代碼,所有其他人都可以盲目猜測。 –
我剛剛在mongoengine模型定義中將'marked_diff'添加爲'FloatField'。它現在有效。我將使用mongoengine模型的上下文來更新這個問題,以便可以理解問題是mongoengine文檔。爲什麼它的行爲如此,我仍然想知道。 –