Является ли DWScript потокобезопасным?



Я хотел бы знать, способен ли DWScript использовать потоки внутри скриптов, поскольку некоторые движки не синхронизируют доступ к своим внутренним структурам данных.

555   2  

2 ответов:

Арно привел ключевые моменты:

  • каждый экземпляр компилятора может быть вызван только из одного потока одновременно. Вы можете иметь несколько экземпляров компилятора, вызываемых в нескольких потоках одновременно, и конкретный экземпляр компилятора может использоваться из нескольких потоков, при условии, что только один поток использует его одновременно.
  • каждая скомпилированная программа может иметь несколько исполнений, каждое выполнение может выполняться в своем собственном потоке. Также конкретное выполнение может использоваться несколькими потоками, при условии, что только один поток использует его одновременно.
  • каждое выполнение имеет свое собственное пространство для своих переменных и свой собственный стек, экземпляры объектов находятся в куче и технически могут быть разделены между исполнениями, для этого нет механизма блокировки, но вы можете сделать свой собственный.
  • скриптовый движок не выполняет никакой синхронизации или блокировки при использовании классов или функций, доступных ему (будь то через TdwsUnit, RTTI и т. д.), поэтому при выполнении сценариев в потоках убедитесь, что вы только открытые потокобезопасные материалы (будьте особенно осторожны с этим для RTTI, так как многие RTL и VCL не являются потокобезопасными для начала)

Выполнение нескольких исполнений скрипта похоже на наличие нескольких потоков в Delphi, хотя каждое новое выполнение имеет не только свой собственный стек (как потоки Delphi), но и свое собственное пространство переменных (в Delphi это было бы немного похоже, если бы у вас везде был "поток var"). И выполнение DWScript не обязательно должно быть в их собственном потоке, их можно перемещать между потоками или опрашивается и используется в меньшем количестве потоков (единственное ограничение состоит в том, что каждое выполнение используется только одним потоком одновременно, как упоминалось выше).

Таким образом, ничто не мешает вам открыть функцию, которая породила бы поток (и соответствующее выполнение) в функции скрипта, но связь между исполнениями не будет осуществляться через общие переменные (как вы могли бы соблазниться сделать в Delphi), а будет проходить через ваши собственные открытые функции (или внешние переменные), возвращаемые значения (с использованием метода "оценки", ср. модульные тесты)," общие "экземпляры объектов или"глобальные vars".

Под "глобальными vars" я подразумеваю функции, определенные в dwsGlobalVarsFunctions.pas, который может использоваться для обмена данными между исполнениями. Чтобы активировать их, просто есть "uses dwsGlobalVarsFunctions" где-то в вашем проекте.

Они предоставляют набор функций Read/WriteGlobalVar, которые позволяют хранить и извлекать именованные варианты во всех исполнениях скрипта выполняется в рамках одного и того же процесса Delphi, и эти операции чтения и записи являются "атомарными" с точки зрения потоковой передачи.

Даже не было необходимости открывать документацию по ДВС. :)

Просто взгляните на этот ответ StackOverflow от Eric :

Например, [DWS] теперь может выполнять несколько потокобезопасных операций с одним скомпилированным скриптом, в то время как старая кодовая база построена вокруг ограничения, что скомпилированный скрипт может выполняться только одним потоком одновременно.

Короче говоря:

  • компилятор DWS не является потокобезопасным: вы должны создайте стек выполнения в одном потоке (вы не можете совместно использовать экземпляр компилятора, вам нужен один поток на экземпляр компилятора);
  • выполнение DWS потокобезопасно, если вы используете один экземпляр выполнения на поток: вы можете запустить один и тот же скомпилированный скрипт в нескольких потоках;
  • связь между потоками недоступна AFAIK, но вы можете использовать Delphi-код, если вам нужна синхронизация.

Конечно, вот официальная страница документации о безопасности потоков в DWS .

Теперь вы можете иметь столько исполнений программы для данной Idwsпрограммы, сколько пожелаете, каждое выполнение будет использовать память только для своей кучи и стека, скомпилированное дерево выражений является общим. Оба новых интерфейса используют управление памятью с учетом ссылок.

Comments

    Ничего не найдено.