Python 如何使用分布式dask?

Python 如何使用分布式dask?,python,dask,dask-distributed,Python,Dask,Dask Distributed,我试图通过查看代码示例和文档来使用Dask,但很难理解它是如何工作的。正如文档中所建议的,我正在尝试使用分布式调度器(我还计划在HPC上部署我的代码) 我尝试的第一件简单的事情是: from dask.distributed import Client import dask.bag as db if __name__ == '__main__': client = Client(n_workers=2) print("hello world") 《hello

我试图通过查看代码示例和文档来使用Dask,但很难理解它是如何工作的。正如文档中所建议的,我正在尝试使用分布式调度器(我还计划在HPC上部署我的代码)

我尝试的第一件简单的事情是:

from dask.distributed import Client
import dask.bag as db

if __name__ == '__main__':
    client = Client(n_workers=2)

print("hello world")
《hello world》被打印了三次,我想这是因为工人们。我假设除非调用compute,否则工人不会启动。 我可以将打印语句移动到函数:

if __name__ == '__main__':
    client = Client(n_workers=2)

def print_func():
    print("hello world")
但是,如何确保只有一个worker执行此函数?(在MPI中,我可以使用
rank==0
;我没有找到任何类似于
MPI\u Comm\u rank()
的东西,它可以告诉我Dask中的工人编号或id)

我更进一步,开始使用Dask中提供的示例:

from dask.distributed import Client
import dask.bag as db

if __name__ == '__main__':
    client = Client()

def is_even(n):
    return n % 2 == 0

b = db.from_sequence([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
c = b.filter(is_even).map(lambda x: x ** 2)
print(c.compute())
但这显示了一个错误:
在当前进程完成其引导阶段之前,尝试启动一个新进程。我假设
dask.bag
会自动分割计算工作。 很抱歉,我的帖子太长了,但我在Dask(我已经习惯了MPI和OpenMP编程)上遇到了麻烦

但是,如何确保只有一个worker执行此函数?(在MPI中,我可以使用
rank==0
;我没有找到任何类似于
MPI\u Comm\u rank()
的东西,它可以告诉我Dask中的工人编号或id)

这实际上是
if uuuuu name uuuu=='\uuuuuu main uuu'
块正在检查的内容。直接运行脚本时,该条件为真;当工人将其作为模块导入时,情况并非如此。您放在该块之外的任何代码在启动时都由每个工作者运行;这应限于函数定义和必要的全局设置。所有实际工作的代码都需要在
if uuuuu name\uuuu=='\uuuuu main\uuuu'
块中,或者只从该块内部调用的函数中

但是,如何确保只有一个worker执行此函数?(在MPI中,我可以使用
rank==0
;我没有找到任何类似于
MPI\u Comm\u rank()
的东西,它可以告诉我Dask中的工人编号或id)


这实际上是
if uuuuu name uuuu=='\uuuuuu main uuu'
块正在检查的内容。直接运行脚本时,该条件为真;当工人将其作为模块导入时,情况并非如此。您放在该块之外的任何代码在启动时都由每个工作者运行;这应限于函数定义和必要的全局设置。所有实际工作的代码都需要在
if uuuu name uuu=='\uuuu main uuu'
块中,或者只从该块内部调用的内部函数中。

措辞巧妙的回答谢谢。因此,我确实将dask包计算移到了一个函数中,并从main调用了该函数。但是,有没有一种打印工人id的方法,或者某种可以告诉我哪个工人处理了哪一段数据的id的方法呢?回答得很好谢谢。因此,我确实将dask包计算移到了一个函数中,并从main调用了该函数。但是,是否有一种方法可以打印工作人员id或某种id来告诉我哪个工作人员处理了哪段数据?