Matlab: закрыть параллельный пул - работает только для parfeval (), но не для spmd - PullRequest
1 голос
/ 09 апреля 2020

Я хотел бы закрыть свой параллельный пул нажатием кнопки в Matlab GUI, чтобы остановить выполнение функций, выполняемых на этих рабочих пула.

К сожалению, это работает только при запуске функций с " parfeval ()». В этом случае, как только я нажимаю кнопку, мой параллельный пул закрывается, и поэтому функции, вызываемые с помощью parfeval (), перестают работать.

Поскольку я предпочитаю использовать "spmd", а не "parfeval", чтобы установить sh связь между рабочими, я попробовал то же самое, но это не удалось.

Ничего не происходит при нажатии кнопки, и параллельный пул отключается, как только я отменяю весь скрипт с помощью ctrl + c.

Надеюсь, что кто-то может помочь мне с этой проблемой.

Работает:

function StartButtonPushed2(app,event)
    pool = gcp();
    parfeval(pool, @dosomething, 0, app);
end

Не работает:

function StartButtonPushed1(app,event)
    pool = gcp();
    spmd 
        dosomething(app);
    end
end

function StopButtonPushed(app,event)
    delete(gcp); %shutdown pool
end

Цель:

Моя конечная цель - параллельно запускать различные функции с помощью кнопки запуска.

Предполагается, что эти функции собирают данные с SPS, OP C UA-сервера и различных датчиков и непрерывно записывают собранные данные в базу данных SQL.

Для записи данных в БД Я думал о другой параллельной функции - давайте назовем ее «writeDB», которая получает порции данных из функций сбора данных и загружает их.

Кнопка «Стоп» должна завершить сбор данных, прерывая все функции - в настоящее время я делаю это, удаляя пул.

Заранее спасибо!

1 Ответ

1 голос
/ 09 апреля 2020

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

Асинхронная оценка fcn не блокирует MATLAB (из doc parfeval)

При использовании parfeval ваш основной экземпляр MATLAB не блокируется, что позволяет GUI выполнить код. Синхронные интерфейсы типа spmd или parfor не подходят для вашей ситуации. Пока рабочие заняты, ваш основной экземпляр заблокирован и не может выполнить какой-либо код.

Связанный (тот же вопрос, запрашивающий parfor): https://mathworks.com/matlabcentral/answers/401838-how-to-halt-parfor-execution-from-a-ui

...