我得到以下错误时设置我的n_jobs
参数
AttributeError: 'Thread' object has no attribute '_children'
我在烧瓶服务中运行这个代码。有趣的是,当运行在烧瓶服务之外时,它不会发生。我只在新安装的Ubuntu盒子上重现过。在我的Mac上,它工作得很好。
这是一个讨论了这一点的线程,但似乎没有超越解决方案:“线程”对象没有属性“_children”-django scikit learn
有什么想法吗?
以下是我的测试代码:
@test.route('/testfun')
def testfun():
from sklearn.ensemble import RandomForestRegressor
import numpy as np
train_data = np.array([[1,2,3], [2,1,3]])
target_data = np.array([1,1])
model = RandomForestRegressor(n_jobs=2)
model.fit(train_data, target_data)
return "yey"
堆栈跟踪:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/vagrant/flask.global-relevance-engine/global_relevance_engine/routes/test.py", line 47, in testfun
model.fit(train_data, target_data)
File "/usr/local/lib/python2.7/dist-packages/sklearn/ensemble/forest.py", line 273, in fit
for i, t in enumerate(trees))
File "/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/parallel.py", line 574, in __call__
self._pool = ThreadPool(n_jobs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 685, in __init__
Pool.__init__(self, processes, initializer, initargs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 136, in __init__
self._repopulate_pool()
File "/usr/lib/python2.7/multiprocessing/pool.py", line 199, in _repopulate_pool
w.start()
File "/usr/lib/python2.7/multiprocessing/dummy/__init__.py", line 73, in start
self._parent._children[self] = None
这可能是由于多处理中的错误造成的。Python2.7之前存在的虚拟
(参见此处和此处)。5和3.3。2.
请参阅注释以确认更新版本适用于OP。
如果您无法升级但有权访问/py/Lib/multiprocessing/dummy/__init。py
,在DummyProcess
类中编辑start
方法,如下所示(应该是第73行):
if hasattr(self._parent, '_children'): # add this line
self._parent._children[self] = None # indent this existing line
DummyProcess
就是这个bug存在的地方。让我们看看它在您导入的代码中的位置,以确保我们在正确的位置修补它。
该链中DummyProcess
的存在保证了它在导入randomForestRegregator
之后已经被导入。此外,我认为在创建任何实例之前,我们都可以访问DummyProcess
类。因此,我们可以对类进行一次修补,而无需查找实例进行修补。
# Let's make it available in our namespace:
from sklearn.ensemble import RandomForestRegressor
from multiprocessing import dummy as __mp_dummy
# Now we can define a replacement and patch DummyProcess:
def __DummyProcess_start_patch(self): # pulled from an updated version of Python
assert self._parent is __mp_dummy.current_process() # modified to avoid further imports
self._start_called = True
if hasattr(self._parent, '_children'):
self._parent._children[self] = None
__mp_dummy.threading.Thread.start(self) # modified to avoid further imports
__mp_dummy.DummyProcess.start = __DummyProcess_start_patch
除非我错过了什么,否则从现在开始,所有创建的DummyProcess实例都将被修补,因此不会发生错误。
对于任何更广泛地使用sklearn的人,我认为你可以反过来实现这一点,并使它适用于所有sklearn,而不是专注于一个模块。在执行任何sklearn导入之前,您需要导入DummyProcess
,并按上述方式对其进行修补。然后sklearn将从一开始就使用补丁类。
原答案:
在我写评论时,我意识到我可能已经发现了您的问题——我认为您的flask环境使用的是较旧版本的python。
原因是,在最新版本的python multiprocessing中,接收错误的行受到以下条件的保护:
if hasattr(self._parent, '_children'):
self._parent._children[self] = None
看起来这个错误是在python 2.7期间修复的(我认为是从2.7.5修复的)。也许你的瓶子是旧的2.7或2.6?
你能检查一下你的环境吗?如果您不能更新解释器,也许我们可以找到一种方法来进行多重处理,以防止它崩溃。
当我执行代码时,我得到一个错误, 属性错误:“WebDriver”对象没有属性“find_element_by_xpath”
我正在尝试使用Selenium和Python编写这段代码,以跳到浏览器的下一个窗口: 但是我不明白为什么会发生这个错误,请帮帮我 错误:attribute错误:“WebDriver”对象没有属性“switch_to_window_handles”
问题内容: 我正在尝试读取文件,并用逗号在每行中拆分一个单元格,然后仅显示包含有关纬度和经度信息的第一和第二个单元格。这是文件: 时间, 纬度,经度 ,类型2015-03-20T10:20:35.890Z, 38.8221664,-122.7649994 ,地震 2015-03-20T10 :18:13.070Z, 33.2073333,-116.6891667 ,地震 2015-03-20T10
我试图分裂链接的图像是什么错在我的代码
我在Jupyter Notebook中运行Keras神经网络模型(Python 3.6) 我得到以下错误 属性错误:列表对象没有属性ndim 从K调用. fi()方法后eras.model 我检查了Keras的requirements.txt文件(在Anaconda3中),Numpy、smpy和六个模块版本都是最新的。 什么可以解释这个属性错误? 完整的错误消息如下(似乎与Numpy有些关联):
我使用要连接到mysql,下面是我的Python语句: 但是有一个错误,这里是日志: 这是我的代码: 我已经创建数据库在谢谢