0

我正在学习 dask,我想生成随机字符串。但这仅在 import 语句位于函数内部f时才有效。

这有效:

import dask
from dask.distributed import Client, progress

c = Client(host='scheduler')

def f():
    from random import choices
    from string import ascii_letters
    rand_str = lambda n: ''.join(choices(population=list(ascii_letters), k=n))
    return rand_str(5)

xs = []
for i in range(3):
    x = dask.delayed(f)()
    xs.append(x)

res = c.compute(xs)
print([r.result() for r in res])

这会打印出类似['myvDi', 'rZnYO', 'MyzaG']. 这很好,因为字符串是随机的。

但是,这不起作用:

from random import choices
from string import ascii_letters
import dask
from dask.distributed import Client, progress

c = Client(host='scheduler')

def f():
    rand_str = lambda n: ''.join(choices(population=list(ascii_letters), k=n))
    return rand_str(5)

xs = []
for i in range(3):
    x = dask.delayed(f)()
    xs.append(x)

res = c.compute(xs)
print([r.result() for r in res])

这会打印出类似['tySQP', 'tySQP', 'tySQP']的内容,这很糟糕,因为所有随机字符串都是相同的。

所以我很好奇我将如何分发大型非平凡代码。我的目标是能够将任意 json 传递给一个dask.delayed函数,并让该函数使用其他模块(如 google 的ortools. 有什么建议么?

4

1 回答 1

0

Python 的random模块很奇怪。

它在第一次导入时创建一些状态,并在生成随机数时使用该状态。不幸的是,拥有这种状态使得难以序列化和在进程之间移动。

您在函数中导入随机数的解决方案就是我所做的。

于 2019-08-05T23:28:53.100 回答