Matlab: остановите параллельный пул - работает только для parfeval(), но не для spmd

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

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

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

При нажатии кнопки ничего не происходит, и параллельный пул закрывается только тогда, когда я отменяю весь скрипт с помощью 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, сервера OPC UA и различных датчиков и непрерывной записи собранных данных в базу данных SQL.

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

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

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


person timosmd    schedule 09.04.2020    source источник


Ответы (1)


Для вашего варианта использования асинхронное выполнение параллельных задач имеет решающее значение.

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

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

Связано (тот же вопрос для parfor): https://mathworks.com/matlabcentral/answers/401838-how-to-halt-parfor-execution-from-a-ui

person Daniel    schedule 09.04.2020
comment
Большое спасибо за информацию! Так что мне нужно придерживаться парфеваля. Но я думаю, что тогда я не смогу установить связь между различными функциями парфеваля, верно? Это может быть проблемой... - person timosmd; 09.04.2020
comment
Я не уверен, как понять ваш вопрос. Ваша цель использовать вывод одной функции в качестве ввода следующей, не передавая данные? Если это так, я бы объединил обе функции в одну анонимную функцию и использовал бы один вызов parfeval. Возможно, я что-то пропустил здесь, новый вопрос с некоторым примером кода может помочь, где должны передаваться данные. - person Daniel; 09.04.2020
comment
Я отредактировал свой первый вопрос и добавил свою конечную цель. - person timosmd; 09.04.2020