【发布时间】:2015-06-11 12:15:06
【问题描述】:
有关更多设置,请参阅this question。我想并行创建许多Toy 类的实例。然后我想把它们写到一个 xml 树中。
import itertools
import pandas as pd
import lxml.etree as et
import numpy as np
import sys
import multiprocessing as mp
def make_toys(df):
l = []
for index, row in df.iterrows():
toys = [Toy(row) for _ in range(row['number'])]
l += [x for x in toys if x is not None]
return l
class Toy(object):
def __new__(cls, *args, **kwargs):
if np.random.uniform() <= 1:
return super(Toy, cls).__new__(cls, *args, **kwargs)
def __init__(self, row):
self.id = None
self.type = row['type']
def set_id(self, x):
self.id = x
def write(self, tree):
et.SubElement(tree, "toy", attrib={'id': str(self.id), 'type': self.type})
if __name__ == "__main__":
table = pd.DataFrame({
'type': ['a', 'b', 'c', 'd'],
'number': [5, 4, 3, 10]})
n_cores = 2
split_df = np.array_split(table, n_cores)
p = mp.Pool(n_cores)
pool_results = p.map(make_toys, split_df)
p.close()
p.join()
l = [a for L in pool_results for a in L]
box = et.Element("box")
box_file = et.ElementTree(box)
for i, toy in itertools.izip(range(len(l)), l):
Toy.set_id(toy, i)
[Toy.write(x, box) for x in l]
box_file.write(sys.stdout, pretty_print=True)
这段代码运行良好。但是我重新定义了__new__ 方法,使其只有随机机会实例化一个类。因此,如果我设置if np.random.uniform() < 0.5,我想创建我要求的实例数量的一半,随机确定。这样做会返回以下错误:
Exception in thread Thread-3:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 380, in _handle_results
task = get()
AttributeError: 'NoneType' object has no attribute '__dict__'
我什至不知道这意味着什么,或者如何避免它。如果我像l = make_toys(table) 那样单片地执行此过程,那么它对于任何随机机会都运行良好。
另一种解决方案
顺便说一句,我知道这可以通过单独保留 __new__ 方法来解决,而是将 make_toys() 重写为
def make_toys(df):
l = []
for index, row in df.iterrows():
prob = np.random.binomial(row['number'], 0.1)
toys = [Toy(row) for _ in range(prob)]
l += [x for x in toys if x is not None]
return l
但我正在尝试了解错误。
【问题讨论】:
-
我不知道上一个答案发生了什么,但请注意,我正在从对象列表中删除
None元素。
标签: python python-multiprocessing