Запуск n экземпляров MATLAB с использованием python параллельно - PullRequest
2 голосов
/ 17 апреля 2020

Я хотел бы запустить некоторые тесты на MATLAB, которые обычно занимают 2 дня, и у меня есть 3 таких теста (таким образом, 3 x 2 = 6 дней). Итак, я запускаю три сеанса MATLAB на своем компьютере windows и запускаю три теста (параллельно), что сокращает время тестирования с 6 до 2 дней.

Я хотел бы сделать аналогичные вещи на python, чтобы вызвать три экземпляра MATLAB (я могу сделать это последовательно, но не параллельно)

import matlab.engine as MAT_E
eng=MAT_E.start_matlab()

test_id=1
isTestDone = eng.runTest1(test_id,nargout=1)   # runTest1 is a .m file which needs to be run

test_id=2
isTestDone = eng.runTest2(test_id,nargout=1)   # runTest2 is a .m file which needs to be run

test_id=3
isTestDone = eng.runTest3(test_id,nargout=1)   # runTest3 is a .m file which needs to be run

Кто-нибудь знает, как я могу это сделать аналогичные вещи параллельно?

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы / предложения / комментарии?

РЕДАКТИРОВАНИЕ / Добавлен скелет runTest1

function out1 = runTest1(test_id)

% some processing happens and variable 'x' is generated 

if x < 0.1
    % some warning
    warning('the samples are incosistent')
    keyboard;
end

if x > 99
    error('simulation encountered some out of bound values')
end


# some more processing 

end

1 Ответ

2 голосов
/ 17 апреля 2020

Документация MATLAB для start_matlab функции здесь говорит:

Каждый раз, когда вы вызываете matlab.engine.start_matlab, он запускает новый процесс MATLAB.

Итак, запустите новый процесс MATLAB для каждого теста и запустите их все. Также из документации здесь мы должны использовать аргумент background=True при запуске функций, чтобы Python мог вызывать все 3 теста, не дожидаясь их завершения sh.

import matlab.engine as MAT_E
eng1 = MAT_E.start_matlab()
eng2 = MAT_E.start_matlab()
eng3 = MAT_E.start_matlab()

# start running the tests
test1_future = eng1.runTest1(1,nargout=1,background=True)
test2_future = eng2.runTest2(2,nargout=1,background=True)
test3_future = eng3.runTest3(3,nargout=1,background=True)

# get the results of all the tests (waits for tests to finish)
result1 = test1_future.result()
result2 = test2_future.result()
result3 = test3_future.result()

# do something with the results...

Если бы у вас было больше 3, вероятно, стоило бы сделать это с al oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...