Вы написали, что, ожидая завершения длинных вычислений, вам нужно выполнить какую-то другую обработку на переднем плане.@async
предоставляет только механизм «зеленой нити» и, следовательно, не подходит для вашей проблемы - ваша программа все равно сможет использовать только один Thread
за раз.Кроме того, в настоящее время в заданиях Julia не поддерживается механизм убийства (если вы сами не делаете это каким-то образом программно).
Чистым решением является использование механизма Julia Distributed
.Ниже приведен пример кода.
Код запускает длительные вычисления - в зависимости от того, завершится ли вычисление в заявленное время результатами или собранными, или процесс будет остановлен.
Наслаждайтесь!
using Distributed
Distributed.addprocs(1) #we add one worker process that will be the
#long-running background computation
wid = workers()[end] #take last worker (there is just one anyway)
const result = RemoteChannel(()->Channel{Tuple}(1));
@everywhere function longrun(result,c=3,time=0)
#write whatever code you need here
for i in 1:c
sleep(time)
println("Working $i at $(myid())")
end
#we use the RemoteChannel to collect the result
put!(result, (c,time,999999, myid()))
end
function ready_or_not(result,wid)
if !isready(result)
println("Computation at $wid will be terminated")
rmprocs(wid)
return nothing
else
return take!(result)
end
end
remote_do(longrun,wid,result) #this takes far less than a second...
sleep(1)
show(ready_or_not(result,wid)) # .. and you should see the result
remote_do(longrun,wid,result,10,3) #this takes 30s
sleep(7)
show(ready_or_not(result,wid)) #ready_or_not() terminates the worker process
Надеюсь, это поможет.