我想知道DWScript是否能够在脚本内部使用线程,因为有些引擎不会同步访问其内部数据结构。
我想知道DWScript是否能够在脚本内部使用线程,因为有些引擎不会同步访问其内部数据结构。
运行多个脚本执行类似于在Delphi中拥有多个线程,但每个新执行不仅具有自己的堆栈(如Delphi线程),还具有自己的变量空间(在Delphi中,它有点像您在每个地方都有“thread var”)。DWScript执行不必在其自己的线程中运行,它们可以在线程之间移动,或者在较少数量的线程中轮询和使用(唯一的限制是每次只有一个线程使用每个执行,如上所述)。
因此,没有任何阻止您公开一个函数,该函数将在脚本函数中生成线程(和相应的执行),但跨执行的通信不会通过共享变量进行(就像您可能会在Delphi中尝试做的那样),但必须通过您自己公开的函数(或外部变量)、返回值(使用“evaluate”方法,参见单元测试)、“共享”对象实例或“全局变量”进行。
通过“全局变量”,我指的是在dwsGlobalVarsFunctions.pas中定义的函数,可用于跨执行数据交换。要激活它们,只需在项目的某个位置使用“uses dwsGlobalVarsFunctions”即可。
它们公开了一组Read/WriteGlobalVar函数,允许在同一Delphi进程中运行的所有脚本执行中存储和检索命名变量,并且从线程的角度来看,这些读取和写入是“原子”的。
甚至不需要打开DWS文档。 :)
例如,[DWS]现在能够对单个编译脚本进行多个线程安全执行,而旧代码库则建立在一个编译脚本一次只能由一个线程执行的限制之上。
简而言之:
当然,这里是DWS线程安全的官方文档页面。
现在,对于给定的IdwsProgram,您可以拥有任意数量的程序执行,每个执行将仅使用其堆栈内存,编译的表达式树是共享的。这两个新接口都使用引用计数内存管理。