nim-lang - 警告 : 'matchIter' is not GC-safe as it accesses 'x' which is a global using GC'ed memory [GcUnsafe2]

标签 nim-lang jester

在 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我想这很难诊断,因为 clown 路线是某种 DSL。

如果消息意味着它的意思,那为什么它只是一个警告?还是误报?或者甚至更多,在路由中使用变量的概念是完全不可能的吗?

最佳答案

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

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

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

希望这可以帮助!

关于nim-lang - 警告 : 'matchIter' is not GC-safe as it accesses 'x' which is a global using GC'ed memory [GcUnsafe2],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49196841/

相关文章:

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

opengl - 使用opengl围绕枢轴原点旋转

security - Jester 中的 CSRF 防伪 token

nim-lang - 我如何搭建一个新的 Nim 项目?

import - 使导入标识符的部分内容对导入者可见(使用?)

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