Каков «правильный» способ закрыть Dask LocalCluster? - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь использовать Dask-Distributed на моем ноутбуке с помощью LocalCluster, но я до сих пор не нашел способ закрыть приложение, не вызывая некоторых предупреждений или не вызывая некоторые странные итерации с помощью matplotlib (я использую серверную часть tkAgg).

Например, если я закрою клиент и кластер в этом порядке, то tk не сможет соответствующим образом удалить образ из памяти, и я получу следующую ошибку:

Traceback (most recent call last):
  File "/opt/Python-3.6.0/lib/python3.6/tkinter/__init__.py", line 3501, in __del__
    self.tk.call('image', 'delete', self.name)
RuntimeError: main thread is not in main loop

Например, следующий код генерирует эту ошибку:

from time import sleep
import numpy as np
import matplotlib.pyplot as plt
from dask.distributed import Client, LocalCluster

if __name__ == '__main__':
    cluster = LocalCluster(
        n_workers=2,
        processes=True,
        threads_per_worker=1
    )
    client = Client(cluster)

    x = np.linspace(0, 1, 100)
    y = x * x
    plt.plot(x, y)

    print('Computation complete! Stopping workers...')
    client.close()
    sleep(1)
    cluster.close()

    print('Execution complete!')

Строка sleep(1) повышает вероятность возникновения проблемы, так как она возникает не при каждом выполнении.

Любойдругая комбинация, которую я пытался остановить выполнение (избегать закрывать клиент, избегать закрывать кластер, избегать закрывать оба), генерирует проблемы с торнадо, вместо этого.Обычно следующее

tornado.application - ERROR - Exception in Future <Future cancelled> after timeout

Какая правильная комбинация для остановки локального кластера и клиента?Я что-то упустил?

Вот библиотеки, которые я использую:

  • python 3. [6,7] .0
  • tornado 5.1.1
  • dask 0.20.0
  • распределено 1.24.0
  • matplotlib 3.0.1

Спасибо за помощь!

1 Ответ

0 голосов
/ 24 апреля 2019

Из нашего опыта - лучший способ - использовать менеджер контекста, например:

import numpy as np
import matplotlib.pyplot as plt
from dask.distributed import Client, LocalCluster 

if __name__ == '__main__':
    cluster = LocalCluster(
    n_workers=2,
    processes=True,
    threads_per_worker=1
    )
    with Client(cluster) as client:
        x = np.linspace(0, 1, 100)
        y = x * x
        plt.plot(x, y)
        print('Computation complete! Stopping workers...')

    print('Execution complete!')
...