Мой проект включает параллельное вычисление карты с использованием функции Distributed
pmap
Джулии.
Отображение заданного элемента может занять несколько секунд , или это может занять по существу навсегда. Я хочу, чтобы тайм-аут или лимит времени для выполнения отдельной задачи / вычисления на карте.
Если задание на карте заканчивается вовремя, отлично, вернуть результат вычисления. Если задание не выполнено к сроку, прекратите вычисление, когда оно будет достигнуто, и верните некоторое значение или сообщение, указывающее, что истекло время ожидания.
Ниже приведен минимальный пример. Сначала импортируются модули, а затем запускаются рабочие процессы:
num_procs = 1
using Distributed
if num_procs > 1
# The main process (no calling addprocs) can be used for `pmap`:
addprocs(num_procs-1)
end
Затем задача сопоставления определяется для всех рабочих процессов. Задание сопоставления должно прерваться через 1 секунду:
@everywhere import Random
@everywhere begin
"""
Compute stuff for `wait_time` seconds, and return `wait_time`.
If `timeout` seconds elapses, stop computation and return something else.
"""
function waitForTimeUnlessTimeout(wait_time, timeout=1)
# < Insert some sort of timeout code? >
# This block of code simulates a long computation.
# (pretend the computation time is unknown)
x = 0
while time()-t0 < wait_time
x += Random.rand() - 0.5
end
# computation completed before time limit. Return wait_time.
round(wait_time, digits=2)
end
end
Функция, которая выполняет параллельное отображение (pmap
), определена в основном процессе. Каждое задание карты в произвольном порядке занимает до 2 секунд, но должно пройти через 1 секунду.
function myParallelMapping(num_tasks = 20, max_runtime=2)
# random task runtimes between 0 and max_runtime
runtimes = Random.rand(num_tasks) * max_runtime
# return the parallel computation of the mapping tasks
pmap((runtime)->waitForTimeUnlessTimeout(runtime), runtimes)
end
print(myParallelMapping())
Как должна быть реализована эта параллельная карта с ограничением по времени?