Как мне запустить dask.распределенный кластер в одном потоке?

Как я могу запустить полный Dask.распределенный кластер в одном потоке? Я хочу использовать это для отладки или профилирования.

Примечание: это часто задаваемый вопрос. Я добавляю вопрос и ответ здесь для переполнения стека только для будущего повторного использования.

1 ответов


Локальный Планировщик

если вы можете обойтись с API планировщика одной машины (просто вычислить), то вы можете использовать однопоточный планировщик

x.compute(scheduler='single-threaded')

Распределенный Планировщик-Одна Машина

если вы хотите запустить dask.распределенный кластер на одной машине вы можете запустить клиент без аргументов

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()

вся связь и управление происходят в одном потоке, хотя вычисление происходит в отдельном пуле потоков.

Распределенный Планировщик-Один Поток

для запуска управления, связи и вычислений в одном потоке вам нужно создать параллельный Торнадо.будущий исполнитель. Будьте осторожны, этот 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