加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – DWScript是线程安全的吗?

发布时间:2020-12-15 04:05:48 所属栏目:大数据 来源:网络整理
导读:我想知道DWScript是否能够在脚本中使用线程,因为某些引擎不会同步访问它的内部数据结构. 解决方法 Arnaud给出了关键点: 每个编译器实例一次只能从一个线程调用.您可以同时在多个线程中调用多个编译器实例,并且可以从多个线程使用特定的编译器实例,前提是只
我想知道DWScript是否能够在脚本中使用线程,因为某些引擎不会同步访问它的内部数据结构.

解决方法

Arnaud给出了关键点:

>每个编译器实例一次只能从一个线程调用.您可以同时在多个线程中调用多个编译器实例,并且可以从多个线程使用特定的编译器实例,前提是只有一个线程一次使用它.
>每个编译的程序可以有多个执行,每个执行都可以在自己的线程中运行.如果一个线程一次只使用一个线程,则多个线程也可以使用特定的执行.
>每个执行都有自己的变量空间,它自己的堆栈,对象实例都在堆上,技术上可以跨执行共享,没有锁定机制,但你可以自己创建.
>当使用暴露给它的类或函数(通过TdwsUnit,RTTI等)时,脚本引擎不执行任何同步或锁定,因此在线程中运行脚本执行时,请确保只暴露线程安全的东西(是特别注意RTTI,因为很多RTL和VCL开始时都不是线程安全的)

运行多个脚本执行类似于在Delphi中拥有多个线程,尽管每个新执行不仅有自己的堆栈(如Delphi线程),还有自己的变量空间(在Delphi中,如果你有“线程”,它会有点像var“无处不在”.并且DWScript执行不必在他们自己的线程中,它们可以跨线程移动,或者在较少数量的线程中轮询和使用(唯一的限制是每次执行仅由一个线程一次使用,如上文提到的).

所以没有什么可以阻止你暴露一个会在脚本函数中产生一个线程(和相应的执行)的函数,但跨执行的通信不会通过共享变量(就像你可能想在Delphi中做的那样),但是会有通过您自己的公开函数(或外部变量),返回值(使用“评估”方法,参见单元测试),“共享”对象实例或“全局变量”.

“global vars”是指dwsGlobalVarsFunctions.pas中定义的函数,它们可用于执行间数据交换.要激活它们,只需在项目中的某处“使用dwsGlobalVarsFunctions”即可.

它们公开了一组Read / WriteGlobalVar函数,这些函数允许在同一个Delphi进程中运行的所有脚本执行中存储和检索命名变体,并且这些函数和从线程的角度来看,写入是“原子的”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读