假设我有一个执行某些处理并将结果存储到redis服务器的函数
r = redis.StrictRedis()
def process(data):
(...do some work...)
r.put(...)
现在我有一大堆数据,我想使用dask来并行化这个过程。类似于
的东西from dask.distributed imoprt Client
client = Client()
for x in data:
client.submit(process,x)
但我得到了KeyError(<function process>)
。有什么想法吗?
修改
根据下面的@mrocklin答案,将连接初始化放在函数内部。我假设当工人来来往往时,连接将被销毁并重新创建。如果我重写我的函数来接受一批数据会更有效率。
def process(batches_data):
r = redis.StrictRedis()
for batch in batches_data:
(...do some work...)
r.put(...)
答案 0 :(得分:2)
我的第一个猜测是你的对象def process(data):
r = redis.StrictRedis()
... do some work
r.put(...)
没有很好地序列化。这是相当典型的,因为具有实时连接的对象通常拒绝被序列化(有充分的理由)。
相反,您可以尝试在函数
中建立连接submit
此外,我建议您保留futures = [client.submit(process, x) for x in L]
wait(futures)
生成的期货。否则,Dask将假设您不再关心这些任务并决定它可以忽略它们
componentWillMount() {
if (this.props.params.searchText) {
this.props.requestPictograms(this.props.params.searchText)
}
}
如果这不能解决您的问题,那么我建议您使用更完整的例外和追溯来编辑原始问题。