Antlr v4 线程安全模式
Antlr v4 thread-safe mode
我的代码是这样写的:
- 首先我用蚂蚁创建例程池:
var pool, _ = ants.NewPoolWithFunc(5, func(commitDiff interface{}) {
AnalyzeCommitDiff(commitDiff.(diffParsedType))
})
*函数 AnalyzeCommitDiff() 包含我的 antlr_analysis 函数
- 然后我写了这些:
var (
lexerPool *sync.Pool = &sync.Pool{New: func() interface{} {
return javaparser.NewJavaLexer(nil)
}}
parserPool *sync.Pool = &sync.Pool{New: func() interface{} {
return javaparser.NewJavaParser(nil)
}}
newTreeShapeListener *sync.Pool = &sync.Pool{New: func() interface{} {
return new(TreeShapeListener)
}}
)
func executeJava(diffText string) javaparser.AnalysisInfoType {
input := antlr.NewInputStream(diffText)
lexer := lexerPool.Get().(*javaparser.JavaLexer)
defer lexerPool.Put(lexer)
lexer.SetInputStream(input)
stream := antlr.NewCommonTokenStream(lexer, 0)
p := parserPool.Get().(*javaparser.JavaParser)
defer parserPool.Put(p)
p.SetTokenStream(stream)
//p.AddErrorListener(antlr.NewDiagnosticErrorListener(true))
p.BuildParseTrees = true
p.GetInterpreter().SetPredictionMode(antlr.PredictionModeSLL)
tree := p.CompilationUnit()
listener := newTreeShapeListener.Get().(*TreeShapeListener)
defer newTreeShapeListener.Put(listener)
antlr.ParseTreeWalkerDefault.Walk(listener, tree)
return javaparser.Infos
}
但是由于不是线程安全的,所以显然存在问题。
如何使我的代码线程安全?
谁能给我举个例子吗?
线程池不适用于 ANTLR4。出于性能原因,没有额外的线程处理,除了解析器或词法分析器访问共享 DFA 的一个地方。
因此,您可以使用线程的唯一方法是将一个 lexer/parser 实例关联到一个线程,并仅从该单个线程访问它。每个解析器实例使用一个专用线程,并且从不在线程之间共享 lexers/parser。
我的代码是这样写的:
- 首先我用蚂蚁创建例程池:
var pool, _ = ants.NewPoolWithFunc(5, func(commitDiff interface{}) {
AnalyzeCommitDiff(commitDiff.(diffParsedType))
})
*函数 AnalyzeCommitDiff() 包含我的 antlr_analysis 函数
- 然后我写了这些:
var (
lexerPool *sync.Pool = &sync.Pool{New: func() interface{} {
return javaparser.NewJavaLexer(nil)
}}
parserPool *sync.Pool = &sync.Pool{New: func() interface{} {
return javaparser.NewJavaParser(nil)
}}
newTreeShapeListener *sync.Pool = &sync.Pool{New: func() interface{} {
return new(TreeShapeListener)
}}
)
func executeJava(diffText string) javaparser.AnalysisInfoType {
input := antlr.NewInputStream(diffText)
lexer := lexerPool.Get().(*javaparser.JavaLexer)
defer lexerPool.Put(lexer)
lexer.SetInputStream(input)
stream := antlr.NewCommonTokenStream(lexer, 0)
p := parserPool.Get().(*javaparser.JavaParser)
defer parserPool.Put(p)
p.SetTokenStream(stream)
//p.AddErrorListener(antlr.NewDiagnosticErrorListener(true))
p.BuildParseTrees = true
p.GetInterpreter().SetPredictionMode(antlr.PredictionModeSLL)
tree := p.CompilationUnit()
listener := newTreeShapeListener.Get().(*TreeShapeListener)
defer newTreeShapeListener.Put(listener)
antlr.ParseTreeWalkerDefault.Walk(listener, tree)
return javaparser.Infos
}
但是由于不是线程安全的,所以显然存在问题。 如何使我的代码线程安全? 谁能给我举个例子吗?
线程池不适用于 ANTLR4。出于性能原因,没有额外的线程处理,除了解析器或词法分析器访问共享 DFA 的一个地方。
因此,您可以使用线程的唯一方法是将一个 lexer/parser 实例关联到一个线程,并仅从该单个线程访问它。每个解析器实例使用一个专用线程,并且从不在线程之间共享 lexers/parser。