我正在尝试使用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()
答案 0 :(得分:0)
您的函数包含对man.session
的引用,它是函数 closure 的一部分。使用默认的调度程序线程时,可以在执行代码的线程之间共享对象。使用分布式调度程序时,必须对函数进行序列化并将其发送给不同过程中的工作程序。
您应该创建一个函数,以在每次调用时创建会话对象,就像对非常相似的问题的建议answer一样。