2012-06-02 21 views
8

Me gustaría saber si DWScript es capaz de usar subprocesos dentro de las secuencias de comandos, ya que algunos motores no sincronizan el acceso a sus estructuras de datos internas.¿DWScript es seguro para subprocesos?

+0

-1 esta pregunta se responde trivialmente leyendo la documentación, la página principal del sitio web del proyecto DWScript, búsqueda en la web, etc. Haga un esfuerzo antes de hacer la pregunta. –

+1

Si la respuesta es tan fácil de encontrar, entonces seguramente debe haber salteado varias veces, o no habría publicado la pregunta. – FHannes

+4

@david: si todos quisieran simplemente rtfm, no habría stackoverflow :) –

Respuesta

4

Arnaud dio los puntos clave:

  • cada instancia compilador sólo se puede invocar desde un hilo a la vez. Puede tener varias instancias de compilador invocadas en varios subprocesos al mismo tiempo, y una instancia de compilador particular se puede usar desde varios subprocesos, siempre que solo un subproceso lo use un tiempo.
  • cada programa compilado puede tener múltiples ejecuciones, cada ejecución puede ejecutarse en su propio hilo. También una ejecución particular puede ser utilizada por varios hilos, siempre que solo un hilo lo use a la vez.
  • cada ejecución tiene su propio espacio para sus variables, y su propia pila, las instancias de objeto están en el montón y técnicamente se pueden compartir entre ejecuciones, no hay un mecanismo de bloqueo para eso, pero puede hacer la suya propia.
  • el motor de scripts no realiza ninguna sincronización o bloqueo cuando se utilizan clases o funciones expuestas (ya sea a través de TdwsUnit, RTTI, etc.), Por lo que cuando se ejecuta ejecuciones de secuencias de comandos en las discusiones, asegúrese de que sólo expone seguro para subprocesos cosas (tenga especial cuidado en eso por RTTI, ya que gran parte de la RTL & VCL no es seguro para subprocesos, para empezar)

Ejecutar múltiples ejecuciones de un script es similar a tener múltiples hilos en Delphi, aunque cada nueva ejecución no solo tiene su propia pila (como hilos Delphi) sino también su propio espacio variable (en Delphi sería como si tuviera "hilo"). var "en todas partes). Y las ejecuciones de DWScript no tienen que estar en su propio hilo, se pueden mover a través de hilos, o sondear y usar en un número menor de hilos (la única limitación es que cada ejecución es utilizada solo por un hilo a la vez, como mencionado anteriormente).

Así que nada le impide exponer una función que generaría un hilo (y la ejecución correspondiente) en una función de script, pero la comunicación entre las ejecuciones no sería a través de variables compartidas (como podría estar tentado en Delphi) , pero tendría que pasar por sus propias funciones expuestas (o variables externas), valores de retorno (usando un enfoque de "evaluación", ver las pruebas unitarias), instancias de objetos "compartidos" o "variables globales".

Por "variables globales", me refiero a las funciones definidas en dwsGlobalVarsFunctions.pas, que se pueden usar para el intercambio de datos entre ejecuciones. Para activarlos, solo tiene un "usa dwsGlobalVarsFunctions" en algún lugar de su proyecto.

Exponen un conjunto de funciones Read/WriteGlobalVar, que permiten almacenar y recuperar variantes nombradas en todas las ejecuciones de scripts que se ejecutan dentro del mismo proceso Delphi, y las lecturas & son "atómicas" desde un punto de vista de subprocesamiento.

+1

¡Qué bueno tener al DWS "padre de Dios" (o papá nuevo) en SO! :) –

+0

Cuando se está ejecutando un objeto TdwsProgramExecution en un hilo, ¿puede otro hilo llamar a TdwsProgramExecution.EndProgram de forma segura? – FHannes

+0

No, pero puede llamar a Detener para eso (que también funciona si lo ejecutó Execute(), en lugar de hacerlo manualmente con BeginProgram/RunProgram). Eso hará que la secuencia de comandos aborte en la primera oportunidad bajo su control, es decir. si su script ejecuta una función Delphi, solo se detendrá después de regresar de esa función. EndProgram hace limpiezas y debe ser llamado desde el hilo de ejecución. –

3

Ni siquiera fue necesario abrir la documentación de DWS. :)

sólo echar un vistazo at this StackOverflow answer by Eric:

Por ejemplo, [DSM] es ahora capaz de múltiples ejecuciones compatibles con el proceso de un solo script compilado, mientras que el antiguo código base se construye alrededor de la limitación que un script compilado se puede ejecutar con solo un hilo a la vez.

En resumen:

  • El compilador DWS no es apta para subprocesos: usted tiene que crear la pila de ejecución dentro de un hilo (no se puede compartir una instancia compilador, se necesita un hilo por instancia de compilador);
  • La ejecución de DWS es segura para subprocesos, si utiliza una instancia de ejecución por subproceso: puede ejecutar el mismo script compilado en varios subprocesos;
  • La comunicación entre subprocesos no está disponible AFAIK, pero puede usar el código Delphi si necesita sincronización.

Por supuesto, aquí está the official documentation page about thread safety in DWS.

Ahora puede tener tantas ejecuciones del programa para un determinado IdwsProgram como desee, cada ejecución utilizará la memoria de su pila montón & solamente, el árbol de expresión compilado es compartida. Ambas interfaces nuevas usan administración de memoria contada por referencia.

+1

Al leer esto, me di cuenta de que ya lo sé, pero a menos que me equivoque, no responde completamente a mi pregunta ... No quiero ejecutar el mismo script en varios hilos, quiero ser ejecutar varios hilos dentro de un único script ... – FHannes

+1

AFAIK hasta ahora entiendo la implementación de la clase de ejecución, no es posible, por diseño. No hay TThread o tal. La única posibilidad será ejecutar varios guiones dentro de un hilo para cada uno (esto es posible, por supuesto), luego intentar hacer un IPC o mutex entre los guiones, tal como lo escribí en mi tercer punto: no hay comunicación entre hilos. disponible desde cero. Prefiero recomendar una arquitectura sin estado, con algunas estructuras de datos compartidas disponibles para las clases Delphi (por ejemplo, expuestas usando RTTI en DWS). –

Cuestiones relacionadas