使用客户端时,Dask计算失败;如果未设置客户端,则计算无效

时间:2018-11-06 00:05:16

标签: dask

我正在尝试使用dask客户端并行化我的计算。当我运行df.compute()时,我得到正确的输出(尽管很慢),但是在设置客户端后运行相同的东西时,出现以下错误:

distributed.protocol.pickle - INFO - Failed to serialize <function part at 0x7fd5186ed730>. Exception: can't pickle _thread.RLock objects

这是我的代码,在第一个df.compute()中,我得到了预期的结果,在第二个中,我没有得到结果。

@dask.delayed
def part(x):
    lower, upper = x
    q = "SELECT id,tfidf_vec,emb_vec FROM document_table"
    lines=man.session.execute(q)
    counter = lower
    df = []
    for line in lines:
        df.append(line)
        counter += 1
        if counter == upper:
            break
    return pd.DataFrame(df)

parts = [part(x) for x in [[0,100000],[100000,200000]]]
df = dd.from_delayed(parts)
df.compute()

from dask.distributed import Client
client = Client('127.0.0.1:8786')
df.compute()

1 个答案:

答案 0 :(得分:0)

您的函数包含对man.session的引用,它是函数 closure 的一部分。使用默认的调度程序线程时,可以在执行代码的线程之间共享对象。使用分布式调度程序时,必须对函数进行序列化并将其发送给不同过程中的工作程序。

您应该创建一个函数,以在每次调用时创建会话对象,就像对非常相似的问题的建议answer一样。