2016-10-19 3 views
4

Предположим, у меня есть две функции. Для выполнения одной функции потребуется некоторое время, другое простое и быстро выполняется. Я хочу запустить их оба одновременно, но каждый из них работает один раз подряд в цикле, который заканчивается после завершения первой функции. Как это можно сделать?Как вызвать вторую функцию во время работы первой функции или наоборот?

## It will take a while to write out ## 
function function_one() 
writedlm(big_array, "/very/large/file.csv") 
end 

## trival function ## 
function function_two() 
return 5 
end 

## I want to run something like this: ## 
function call_both() 
    while function_one() 
    function_two() 
    end 
end 

call_both() 

Я считаю, что мне нужно настроить параллельный процесс здесь, но я не вижу, как он должен работать.

ответ

3

Вот возможное решение с использованием глобальной (но сопзЬ для типа-вывода) переменная:

const done_function_one = Ref{Bool}(false) 

function call_both() 
    done_function_one[] = false 
    @sync begin 
    @async begin 
     function_one() 
     done_function_one[] = true 
    end 
    @async begin 
     while !done_function_one[] 
     function_two() 
     end 
    end 
    end 
end 

Более компактная реализация возможна, но основная идея проста - использовать глобальную переменную (иногда называется mutex). Примечание call_both выходит только после небольшого количества function_two, который остается (когда function_one завершен) была закончена обработка.

Смежные вопросы