nim-lang - 如何在 Nim 中编写异步代码以供计时器定期调用?

标签 nim-lang

我需要每隔 500 毫秒定期将缓存保存到磁盘,我该怎么做?
我试过的代码没有正确编译。另外,似乎asyncCheck应该用于错误检查。

import tables, os, asyncdispatch

var cache = init_table[string, int]()

proc save(cache: Table[string, int]): Future[void] {.async.} =
  echo cache

addTimer(
  timeout = 500, oneshot = false, cb = proc() = discard cache.save()
)

for i in (0..3):
  cache["a"] = i
  echo cache
  sleep 1000

最佳答案

我想这就是你所追求的

import tables,asyncdispatch,strformat    

#global, GC'd variable, careful!         
var cache = initTable[string, int]()    
     
proc save(){.async.} =                                  
  while true:    
    echo &"writing cache:{cache}"    
    await sleepAsync(500)    

#just some fake data sources         
proc write1(){.async.} =  
  await sleepAsync(900)
  for i in 0..99:                                            
    cache["a"]=i     
    await sleepAsync(20)
#that happen at various rates
proc write2(){.async.} = 
  for i in 0..99:
     cache["b"]=i
     await sleepAsync(33)

#asyncCheck when we're not interested in the Future from a proc
#it will raise an Exception if the proc has an error
asyncCheck save() #save starts running asynchronously

echo "but we can still run other code"

waitFor:          #blocks here until both write1 and write2 finish            
  write1() and write2()

echo "writing is done but save is still running"
cache["c"]=17

#os.sleep would block the whole thread, including save so instead
waitFor(sleepAsync(500)) #wait for save to echo one more time

echo "quit"
输出类似:
writing cache:{:}
but we can still run other code
writing cache:{"b": 15}
writing cache:{"b": 30, "a": 4}
writing cache:{"b": 45, "a": 29}
writing cache:{"b": 59, "a": 54}
writing cache:{"b": 74, "a": 78}
writing cache:{"b": 89, "a": 99}
writing is done but save is still running
writing cache:{"b": 99, "c": 17, "a": 99}
quit

关于nim-lang - 如何在 Nim 中编写异步代码以供计时器定期调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63771318/

相关文章:

generics - 为什么无法推断泛型类型?

types - "static type"和 "dynamic type"怎么可能不同?

nim-lang - nim jester如何更改静态路由和目录

json - 如何在 Nim 中将对象转换为 json

c - 假设没有 “lend”,将 “concurrent access”内存块安全地锁定到C中的另一个线程

sorting - 如何在 Nim 中对序列进行排序?

nim-lang - 从 NodeJs 调用 nim proc

nim-lang - 如何更改 Nim 编译器输出文件位置和名称

arrays - 如何在 Nim 中连接两个数组?