由于从 Windows 到 Linux 的转换而导致的 dask mro 错误

dask mro Error due to transition from Windows to Linux

我使用 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) 更新到最新版本没有帮助。

关于如何修复它有什么建议吗?

谢谢

你的例子实际上对我来说在 Linux 上工作得很好,在 Python 2.7 和 3.6 上都是如此。

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

class simulation():

这很奇怪,通常您会在 Python 2.7

中看到以下内容之一
class simulation(object):  # new style class
class simulation:  # old style class

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

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

mro(method-resolution-order in python)是python的objectclass的内置属性,定义了初始化的顺序多重继承场景中的对象。

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

出于某种原因,在我的 windows 版本上,__mro__ 属性不是必需的,但它在 linux.

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

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