如何在单个线程中运行完整的Dask.distributed集群?我想用它进行调试或分析。
注意:这是一个经常被问到的问题。我在这里将问题和答案添加到Stack Overflow中,以便将来重用。
答案 0 :(得分:13)
如果您可以使用单机调度程序的API(只是计算),那么您可以使用单线程调度程序
x.compute(scheduler='single-threaded')
如果要在一台计算机上运行dask.distributed集群,可以启动没有参数的客户端
from dask.distributed import Client
client = Client() # Starts local cluster
x.compute()
这使用多个线程,但在一台机器上运行
或者,如果您想在一个过程中运行所有内容,则可以使用processes=False
关键字
from dask.distributed import Client
client = Client(processes=False) # Starts local cluster
x.compute()
所有的通信和控制都发生在一个线程中,尽管计算发生在一个单独的线程池中。
要在一个线程中运行控制,通信和计算,您需要创建一个Tornado concurrent.futures Executor。请注意,此Tornado 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