写信给dask worker的redis

时间:2016-12-12 08:34:52

标签: dask

假设我有一个执行某些处理并将结果存储到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(...)

1 个答案:

答案 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)
    }
  }

如果这不能解决您的问题,那么我建议您使用更完整的例外和追溯来编辑原始问题。