Python 多处理:AttributeError:“测试”对象没有属性“get_type”
Posted
技术标签:
【中文标题】Python 多处理:AttributeError:“测试”对象没有属性“get_type”【英文标题】:Python Multiprocessing: AttributeError: 'Test' object has no attribute 'get_type' 【发布时间】:2015-10-25 16:04:28 【问题描述】:短版:
我无法并行化使用实例方法的代码。
加长版:
此python代码产生错误:
Error
Traceback (most recent call last):
File "/Users/gilzellner/dev/git/3.2.1-build/cloudify-system-tests/cosmo_tester/test_suites/stress_test_openstack/test_file.py", line 24, in test
self.pool.map(self.f, [self, url])
File "/Users/gilzellner/.virtualenvs/3.2.1-build/lib/python2.7/site-packages/pathos/multiprocessing.py", line 131, in map
return _pool.map(star(f), zip(*args)) # chunksize
File "/Users/gilzellner/.virtualenvs/3.2.1-build/lib/python2.7/site-packages/multiprocess/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/Users/gilzellner/.virtualenvs/3.2.1-build/lib/python2.7/site-packages/multiprocess/pool.py", line 567, in get
raise self._value
AttributeError: 'Test' object has no attribute 'get_type'
这是我遇到的实际问题的简化版本。
import urllib2
from time import sleep
from os import getpid
import unittest
from pathos.multiprocessing import ProcessingPool as Pool
class Test(unittest.TestCase):
def f(self, x):
print urllib2.urlopen(x).read()
print getpid()
return
def g(self, y, z):
print y
print z
return
def test(self):
url = "http://nba.com"
self.pool = Pool(processes=1)
for x in range(0, 3):
self.pool.map(self.f, [self, url])
self.pool.map(self.g, [self, url, 1])
sleep(10)
由于这里的建议,我正在使用 pathos.multiprocessing: Multiprocessing: Pool and pickle Error -- Pickling Error: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
在使用 pathos.multiprocessing 之前,错误是:
"PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed"
【问题讨论】:
请粘贴整个回溯 - 不知何故,Test
的实例被传递而不是 url
完成,感谢您的帮助!
这里需要使用实例吗?不能用函数吗?
这是我正在研究的更大的东西的一个更小的版本。 (github.com/cloudify-cosmo/cloudify-system-tests)。我特意把它做成了缩小版,所以我可以把它放在这里。
你在windows上吗?当您不使用pathos.helpers.freeze_support
并从__main__
运行时,此self._value
错误通常发生在Windows 上。在非 Windows 系统上,此错误不太常见。
【参考方案1】:
您错误地使用了多处理 map
方法。
根据python docs:
map() 内置函数的并行等效项(仅支持 一个可迭代的参数)。
凡标准map
:
将函数应用于可迭代的每个项目并返回一个列表 结果。
Example usage:
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
p = Pool(5)
print(p.map(f, [1, 2, 3]))
你要找的是apply_async方法:
def test(self):
url = "http://nba.com"
self.pool = Pool(processes=1)
for x in range(0, 3):
self.pool.apply_async(self.f, args=(self, url))
self.pool.apply_async(self.g, args=(self, url, 1))
sleep(10)
【讨论】:
pathos.multiprocessing 没有“apply_async”方法。但没关系,我解决了这个问题 您也可以使用map
,但您需要以其他方式传递参数;)
所以现在这个例子可以工作了,但是我在我的真实代码中遇到了一个不同的问题,将打开一个新问题。
我是pathos
的作者。 pool
中的 pathos
具有 apipe
而不是 apply_async
。或者,如果您想使用apply_async
,那么您可以直接使用pathos.helpers.mp.Pool
中的multiprocessing
分叉代码……它确实有apply_async
。同样,pathos
使用amap
而不是map_async
……但是pathos.helpers.mp.Pool
确实有map_async
。
我现在遇到另一个错误,我不知道如何询问这个问题,因为我无法在一篇文章中包含整个框架。但本质上:TypeError: super(type, obj): obj must be an instance or subtype of type【参考方案2】:
该错误表明您正在尝试读取未为对象 Test 定义的属性。
AttributeError: 'Test' 对象没有属性 'get_type'"
在您的类测试中,您没有定义 get_type 方法或任何其他属性,因此出现错误。
【讨论】:
如你所见,我没有在我的代码中阅读它,这主要是我问问题的原因 这绝对不是解决办法以上是关于Python 多处理:AttributeError:“测试”对象没有属性“get_type”的主要内容,如果未能解决你的问题,请参考以下文章
Windows 上的 Python DEAP 和多处理:AttributeError
Python 多处理:AttributeError:“测试”对象没有属性“get_type”
Python多处理错误:AttributeError:模块'__main__'没有属性'__spec__'
Python 错误:AttributeError:“模块”对象没有属性“heappush”