警告:“matchIter”不是 GC 安全的,因为它访问“x”,这是使用 GC 内存的全局 [GcUnsafe2]

v.o*_*dou 4 nim-lang jester

在 nim 中构建此代码时:

import jester, asyncdispatch    
let stuff = "thing"    
routes:
  get "/":
    resp stuff
runForever()
Run Code Online (Sandbox Code Playgroud)

结果是:

mytest.nim(3, 1) 模板/通用实例化来自此处 lib/core/macros.nim(369, 70) 模板/通用实例化来自此处 lib/pure/asyncmacro.nim(355, 31) 警告:“matchIter”是不是 GC 安全的,因为它访问的是使用 GC 内存的全局“东西”[GcUnsafe2]

我想它指的是变量stuff,并且我想很难诊断,因为小丑路由是某种 DSL。

如果该消息的意思就是它的意思,那么为什么它只是一个警告?还是误报?或者更重要的是,在路由中使用变量的概念根本不可能吗?

dom*_*m96 5

Jester生成的过程都被标记为{.gcsafe.},这使得编译器检查该过程是否访问任何全局变量。

只要 Jester(和您的应用程序)是单线程的,访问全局变量对于您的应用程序来说应该不是问题,但是一旦您的程序使用多线程(例如并行处理请求),您将需要解决此问题。

修复它的一种方法是使用{.threadvar.}:https://nim-lang.org/docs/manual.html#threads-threadvar-pragma

希望这可以帮助!