警告:'matchIter' 不是 GC 安全的,因为它访问 'x' 这是一个全局使用 GC 的内存 [GcUnsafe2]
Warning: 'matchIter' is not GC-safe as it accesses 'x' which is a global using GC'ed memory [GcUnsafe2]
在 nim 中构建此代码时:
import jester, asyncdispatch
let stuff = "thing"
routes:
get "/":
resp stuff
runForever()
它导致:
mytest.nim(3, 1) template/generic instantiation from here
lib/core/macros.nim(369, 70) template/generic instantiation from here
lib/pure/asyncmacro.nim(355, 31) Warning: 'matchIter' is not GC-safe
as it accesses 'stuff' which is a global using GC'ed memory
[GcUnsafe2]
我想它指的是变量 stuff
并且我想这很难诊断,因为小丑路由是某种 DSL。
如果消息的意思就是它的意思,那为什么它只是一个警告?还是误报?甚至更多,在路由中使用变量的概念是不可能的吗?
Jester 生成的过程被标记为{.gcsafe.}
,这使得编译器检查过程是否访问任何全局变量。
只要 Jester(和您的应用程序)是单线程的,访问全局变量对您的应用程序来说应该不是问题,但是一旦您的程序使用多线程(例如并行处理请求),您将需要解决这个问题。
修复它的一种方法是使用 {.threadvar.}
:https://nim-lang.org/docs/manual.html#threads-threadvar-pragma
希望对您有所帮助!
在 nim 中构建此代码时:
import jester, asyncdispatch
let stuff = "thing"
routes:
get "/":
resp stuff
runForever()
它导致:
mytest.nim(3, 1) template/generic instantiation from here lib/core/macros.nim(369, 70) template/generic instantiation from here lib/pure/asyncmacro.nim(355, 31) Warning: 'matchIter' is not GC-safe as it accesses 'stuff' which is a global using GC'ed memory [GcUnsafe2]
我想它指的是变量 stuff
并且我想这很难诊断,因为小丑路由是某种 DSL。
如果消息的意思就是它的意思,那为什么它只是一个警告?还是误报?甚至更多,在路由中使用变量的概念是不可能的吗?
Jester 生成的过程被标记为{.gcsafe.}
,这使得编译器检查过程是否访问任何全局变量。
只要 Jester(和您的应用程序)是单线程的,访问全局变量对您的应用程序来说应该不是问题,但是一旦您的程序使用多线程(例如并行处理请求),您将需要解决这个问题。
修复它的一种方法是使用 {.threadvar.}
:https://nim-lang.org/docs/manual.html#threads-threadvar-pragma
希望对您有所帮助!