Mongoengine 文档在多处理映射后重置属性的值



我有一个很大的元素列表~100000,需要按如下方式映射它:

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的默认值为0itemmongoengine document

我之所以采用多处理,是因为mark_diff比这里显示的要复杂得多,并且涉及许多指数,即我正在使用 numpy 的对数。

现在问题来了,

返回的data仍然具有item.marked_diff作为0。 如果我在底部添加一个打印语句mark_diff则会分配正确的值并且不为零。

项的定义。

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]

所以你没有展示的东西发生了一些事情。 当我将其充实到一个完整的可执行程序中时,它似乎工作正常。 以下是在 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()返回的项目中查看?

相关内容

  • 没有找到相关文章

最新更新