Dask distrib.utils_test.client не наследует переменные среды родительского процесса? - PullRequest
1 голос
/ 01 ноября 2019

Я использую pytest для проверки своих рабочих процессов. У меня есть определенный рабочий процесс, ingest_l0_files, который использует Client, чтобы отобразить задачи для работников. Во время тестирования мне нужно искусственно установить путь к каталогу, который задается в переменной среды с именем CURRENT_RUN_LOG_PATH. Важно отметить, что эта настройка работает безупречно во время тестирования интеграции и реальных прогонов;Я установил переменную окружения в моем скрипте драйвера, и все мои работники получили к нему доступ (потому что они, вероятно, порождены вашим главным процессом). Однако в моем тесте (искусственно установленная) переменная окружения недоступна для рабочих. Почему? Возможно, я могу сказать своему utils_test.client, чтобы он заново инициализировал свою среду и затем передал ее своим работникам?

from distributed.utils_test import client
def test_ingest_l0_files(client, clean_database_fixture, tmpdir):
    """Test the workflow function `ingest_l0_files`"""
    os.putenv('CURRENT_RUN_LOG_PATH', f'{tmpdir}')
    get_config('CURRENT_RUN_LOG_PATH')
    client = client()
    unique_obs = workflow.ingest_l0_files([L0_ALL_FILE, L0_LPT_FILE], client)
    assert len(unique_obs) == 20
    os.unsetenv('CURRENT_RUN_LOG_PATH')

1 Ответ

0 голосов
/ 03 ноября 2019

Вы правы, что приспособление client pytest не особенно расширяемо.

Если вы знакомы с асинхронным программированием, то я рекомендую декоратор @gen_cluster, который предоставляет гораздо больше опций:

@gen_cluster(
    client=True,
    Worker=Nanny,
    worker_options={"env": {"FOO": "BAR"}},
)
async def test_foo(client, scheduler, worker_a, worker_b):
    await ...

Но для этого потребуется, чтобы ваш код был асинхронным, чтоможет или не может быть так. Если вы вызываете неасинхронные методы, тогда этот тест будет бесполезно блокироваться.

https://distributed.dask.org/en/latest/develop.html#writing-tests

...