ttasks.nim
1 import std/os 2 3 import chronos 4 import chronos/threadsync 5 import chronos/unittest2/asynctests 6 import taskpools 7 8 import apatheia/tasks 9 import apatheia/memretainers 10 11 proc addNums(a, b: float): float {.asyncTask.} = 12 os.sleep(50) 13 return a + b 14 15 proc addNumValues(vals: openArray[float]): float {.asyncTask.} = 16 os.sleep(100) 17 result = 0.0 18 for x in vals: 19 result += x 20 21 proc strCompute(val: openArray[char]): int {.asyncTask.} = 22 ## note includes null terminator! 23 return val.len() 24 25 26 suite "async tests": 27 var tp = Taskpool.new(num_threads = 2) # Default to the number of hardware threads. 28 var jobsVar = newJobQueue[float](taskpool = tp) 29 30 proc getJobs(): JobQueue[float] = 31 {.cast(gcsafe).}: 32 jobsVar 33 34 asyncTest "test addNums": 35 let jobs = getJobs() 36 let res = await jobs.submit(addNums(1.0, 2.0,)) 37 check res == 3.0 38 39 asyncTest "test addNumValues": 40 let jobs = getJobs() 41 let args = @[1.0, 2.0, 3.0] 42 let res = await jobs.submit(addNumValues(args)) 43 check res == 6.0 44 45 asyncTest "test strCompute": 46 var jobs = newJobQueue[int](taskpool = tp) 47 let res = await jobs.submit(strCompute("hello world!")) 48 check res == 13 # note includes cstring null terminator 49 50 asyncTest "testing openArrays": 51 var jobs = newJobQueue[float](taskpool = tp) 52 let fut1 = jobs.submit(addNumValues(@[1.0.float, 2.0])) 53 let fut2 = jobs.submit(addNumValues(@[3.0.float, 4.0])) 54 check retainedMemoryCount() == 2 55 let res1 = await fut1 56 let res2 = await fut2 57 check res1 == 3.0 58 check res2 == 7.0 59 check retainedMemoryCount() == 0