add timeout function
This commit is contained in:
45
src/util.jl
45
src/util.jl
@@ -1,7 +1,7 @@
|
|||||||
module util
|
module util
|
||||||
|
|
||||||
export timedifference, showstracktrace, findHighestIndexKey, uuid4snakecase, replaceDictKeys,
|
export timedifference, showstracktrace, findHighestIndexKey, uuid4snakecase, replaceDictKeys,
|
||||||
findMatchingDictKey, textToDict, randstring, randstrings
|
findMatchingDictKey, textToDict, randstring, randstrings, timeout
|
||||||
|
|
||||||
using JSON3, DataStructures, Distributions, Random, Dates, UUIDs, MQTTClient
|
using JSON3, DataStructures, Distributions, Random, Dates, UUIDs, MQTTClient
|
||||||
|
|
||||||
@@ -369,6 +369,49 @@ end
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
""" Execute a function with timer.
|
||||||
|
|
||||||
|
# Arguments
|
||||||
|
- `f::Function`
|
||||||
|
a function to run
|
||||||
|
- `timeoutwindow::Integer``
|
||||||
|
timeout in seconds
|
||||||
|
|
||||||
|
# Keyword Argument
|
||||||
|
- `fargs`
|
||||||
|
arguments for the function
|
||||||
|
|
||||||
|
# Return
|
||||||
|
- task result otherwise timeout message
|
||||||
|
|
||||||
|
# Example
|
||||||
|
```jldoctest
|
||||||
|
julia> function testfunc(x)
|
||||||
|
sleep(x)
|
||||||
|
return "task done"
|
||||||
|
end
|
||||||
|
julia> result = timeout(testfunc, 10; fargs=20)
|
||||||
|
"task timed out"
|
||||||
|
julia> result = timeout(testfunc, 20; fargs=10)
|
||||||
|
"task done"
|
||||||
|
```
|
||||||
|
|
||||||
|
# Signature
|
||||||
|
"""
|
||||||
|
function timeout(f::Function, timeoutwindow::Integer; fargs=nothing, timeoutmsg="task timed out")
|
||||||
|
tsk = @task f(fargs)
|
||||||
|
schedule(tsk)
|
||||||
|
Timer(timeoutwindow) do timer
|
||||||
|
istaskdone(tsk) || Base.throwto(tsk, InterruptException())
|
||||||
|
end
|
||||||
|
try
|
||||||
|
fetch(tsk)
|
||||||
|
catch _;
|
||||||
|
timeoutmsg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user