我想知道DWScript是否能够在脚本中使用线程,因为某些引擎不会同步访问它的内部数据结构。
答案 0 :(得分:4)
Arnaud给出了关键点:
运行多个脚本执行类似于在Delphi中拥有多个线程,虽然每个新执行不仅有自己的堆栈(如Delphi线程),还有自己的变量空间(在Delphi中,如果你有点像到处都有“线程变量”。并且DWScript执行不必在他们自己的线程中,它们可以跨线程移动,或者在较少数量的线程中轮询和使用(唯一的限制是每次执行仅由一个线程一次使用,如如上所述)。
所以没有什么可以阻止你暴露一个会在脚本函数中产生一个线程(和相应的执行)的函数,但是执行中的通信不会通过共享变量进行(就像你可能想在Delphi中做的那样),但是必须经历你自己的暴露函数(或外部变量),返回值(使用“评估”方法,参见单元测试),“共享”对象实例或“全局变量”。
“global vars”是指dwsGlobalVarsFunctions.pas中定义的函数,它们可用于执行间数据交换。要激活它们,只需在项目中的某处“使用dwsGlobalVarsFunctions”。
它们公开了一组Read / WriteGlobalVar函数,这些函数允许在同一个Delphi进程中运行的所有脚本执行中存储和检索命名变体,并且这些函数和从线程的角度来看,写入是“原子的”。
答案 1 :(得分:3)
甚至没有必要打开DWS文档。 :)
看看at this StackOverflow answer by Eric:
例如,[DWS]现在能够对单个编译脚本进行多个线程安全执行,而旧代码库是围绕编译脚本一次只能由一个线程执行的限制构建的。
简而言之:
当然,这是the official documentation page about thread safety in DWS。
现在,您可以根据需要为给定的IdwsProgram执行尽可能多的程序执行,每次执行都将使用内存用于其堆和&仅堆栈,共享编译的表达式树。这两个新接口都使用引用计数内存管理。