0

我已经使用daskdelayedcompute方法构建了 Python 2.7 代码。

这是我的代码的一个小例子:

from dask import delayed, compute
import time

class simulation():
   # defines simulation parameters
   def __init__(self,x):
        self.x = x

jobs = range(50) # sample jobs

def simulate(sim):
    # sample simulation function
    time.sleep(0.01*sim.x)
    return sim.x**2

def save_results(results):
    # sample dump results function
    print results
    return []

results = []
for i,j in enumerate(jobs) :
    sim = simulation(j)
    res  = delayed(simulate)(sim) # running simulation given input params as job
    results.append(res)
    if i%10==0 or i==len(jobs)-1: # evaluation every 50 steps
        results  = compute(results)[0] # dask execution
        results  = save_results(results) # storing results to DB and returning empty list

出于某种原因,此代码在 windows 上的 anaconda 设置上完美运行,但在 Linux 上失败。

我得到的错误是:

--> 134          res  = delayed(simulate)(simulation)
    135 
    136 

...

/home/user/.conda/envs/neuro/lib/python2.7/abc.pyc in __subclasscheck__(cls, subclass)
    159             return False
    160         # Check the subclass hook
--> 161         ok = cls.__subclasshook__(subclass)
    162         if ok is not NotImplemented:
    163             assert isinstance(ok, bool)

/home/user/.conda/envs/neuro/lib/python2.7/site-packages/backports_abc.pyc

 in __subclasshook__(cls, C)
     64         def __subclasshook__(cls, C):
     65             if cls is Generator:
---> 66                 mro = C.__mro__
     67                 for method in required_methods:
     68                     for base in mro:

AttributeError: class simulation has no attribute '__mro__'

将软件包 ( dask) 更新到最新版本并没有帮助。

关于如何修复它的任何建议?

谢谢

4

2 回答 2

2

您的示例实际上对我在 Linux 上运行良好,包括 Python 2.7 和 3.6。

但是,正如您在评论中指出的那样,我怀疑您的问题与这一行有关:

class simulation():

这很奇怪,通常您会在 Python 2.7 中看到以下内容之一

class simulation(object):  # new style class
class simulation:  # old style class

我建议尝试其中一种,看看是否能解决您的问题。

于 2017-07-09T21:55:00.200 回答
0

显然,由于dask试图并行执行命令,它需要在任务之间建立依赖路径。

mropython中的method-resolution-order)是python类的内置属性object,定义了多继承场景下对象的初始化顺序。

dask在依赖路径中找到simulation对象,因此检查它mro以找出正确的初始化顺序。

出于某种原因,在我的 Windows 版本上,__mro__不需要属性,但它在 linux 上。

使用直接继承 fromobject将创建此属性,并解决问题:

class simulation(object):
   # defines simulation parameters
   def __init__(self,x):
        self.x = x
于 2017-07-10T07:16:18.690 回答