Python 如何在单个线程中运行dask.distributed集群?

Python 如何在单个线程中运行dask.distributed集群?,python,dask,Python,Dask,如何在单个线程中运行完整的Dask.distributed集群?我想使用它进行调试或分析 注意:这是一个常见问题。我将在这里添加问题和答案,以使堆栈溢出仅用于将来的重用。Local Scheduler 如果您可以使用单机调度器的API(只需计算),那么您可以使用单线程调度器 x.compute(scheduler='single-threaded') 分布式调度器-单机 如果要在一台计算机上运行dask.distributed集群,可以无参数启动客户机 from dask.distribute

如何在单个线程中运行完整的Dask.distributed集群?我想使用它进行调试或分析

注意:这是一个常见问题。我将在这里添加问题和答案,以使堆栈溢出仅用于将来的重用。

Local Scheduler 如果您可以使用单机调度器的API(只需计算),那么您可以使用单线程调度器

x.compute(scheduler='single-threaded')
分布式调度器-单机 如果要在一台计算机上运行dask.distributed集群,可以无参数启动客户机

from dask.distributed import Client
client = Client()  # Starts local cluster
x.compute()
它使用多个线程,但在一台机器上运行

分布式调度器-单进程 或者,如果希望在单个进程中运行所有内容,则可以使用
processs=False
关键字

from dask.distributed import Client
client = Client(processes=False)  # Starts local cluster
x.compute()
所有通信和控制都发生在单个线程中,尽管计算发生在单独的线程池中

分布式调度程序-单线程 要在单个线程中运行控制、通信和计算,您需要创建Tornado concurrent.futures执行器。注意,此龙卷风API可能不是公开的

from dask.distributed import Scheduler, Worker, Client
from tornado.concurrent import DummyExecutor
from tornado.ioloop import IOLoop
import threading

loop = IOLoop()
e = DummyExecutor()
s = Scheduler(loop=loop)
s.start()
w = Worker(s.address, loop=loop, executor=e)
loop.add_callback(w._start)

async def f():
    async with Client(s.address, start=False) as c:
        future = c.submit(threading.get_ident)
        result = await future
        return result

>>> threading.get_ident() == loop.run_sync(f)
True

这可能是一个无知的问题,但是有没有办法以同步方式执行最后一个基于
dummeyexecutor
的方法?如果您只想有一个线程处于活动状态,就没有办法了。为了使调用submit、等待stuff等的线程在线程工作的同时处于活动状态,您需要采用异步编程风格。为了调试,我有一个模拟类,它实现了主要原语(
submit
map
等)和计算块;因此,submit评估函数并返回状态为“finished”的future,但会立即引发错误。也许这与常规的
客户机
框架不同,但拥有完整的堆栈跟踪并能够在IPython中进行%调试是很好的。