stringtranslate.com

Invocación de método asincrónico

En la programación informática multiproceso , la invocación de método asincrónico ( AMI ), también conocida como llamadas de método asincrónico o patrón asincrónico , es un patrón de diseño en el que el sitio de la llamada no se bloquea mientras se espera que finalice el código llamado. En cambio, se notifica al hilo que realiza la llamada cuando llega la respuesta. El sondeo para obtener una respuesta es una opción no deseada.

Fondo

AMI es un patrón de diseño para la invocación asincrónica de métodos potencialmente de larga duración de un objeto . [1] Es equivalente al patrón IOU ("Te debo") descrito en 1996 por Allan Vermeulen. [2] [3]

En la mayoría de los lenguajes de programación, un método llamado se ejecuta de forma sincrónica, es decir, en el hilo de ejecución desde el que se invoca. Si el método tarda mucho tiempo en completarse, por ejemplo, porque está cargando datos a través de Internet, el hilo que lo invoca se bloquea hasta que el método haya terminado. Cuando esto no se desea, es posible iniciar un "hilo de trabajo" e invocar el método desde allí. En la mayoría de los entornos de programación, esto requiere muchas líneas de código, especialmente si se tiene cuidado de evitar la sobrecarga que puede causar la creación de muchos hilos. AMI resuelve este problema al ampliar un método de objeto potencialmente de larga ejecución ("sincrónico") con una variante "asincrónica" que regresa inmediatamente, junto con métodos adicionales que facilitan la recepción de notificaciones de finalización o la espera de finalización en un momento posterior.

Un uso común de AMI es en el patrón de diseño de objetos activos . Las alternativas son la invocación de métodos sincrónicos y los objetos futuros . [4] Un ejemplo de una aplicación que puede hacer uso de AMI es un navegador web que necesita mostrar una página web incluso antes de que se carguen todas las imágenes.

Dado que el método es un caso especial de procedimiento , la invocación de método asincrónico es un caso especial de llamada a procedimiento asincrónico .

Implementaciones

Clase Java

La clase FutureTask [5] en Java utiliza eventos para resolver el mismo problema. Este patrón es una variante de AMI cuya implementación conlleva más sobrecarga, pero es útil para objetos que representan componentes de software .

Marco .NET

Ejemplo

El siguiente ejemplo se basa libremente en un estilo AMI estándar utilizado en .NET Framework . [9] Dado un método Accomplish, se agregan dos métodos nuevos BeginAccomplishy EndAccomplish:

clase Ejemplo { Resultado Cumplir ( args ) IAsyncResult BeginAccomplish ( args ) Resultado FinAccomplish ( IAsyncResult a ) }            

Al llamar a BeginAccomplish, el cliente recibe inmediatamente un objeto de tipo AsyncResult(que implementa la IAsyncResultinterfaz), por lo que puede continuar el hilo de llamada con trabajo no relacionado. En el caso más simple, finalmente ya no hay más trabajo de ese tipo y el cliente llama EndAccomplish(pasando el objeto recibido anteriormente), que se bloquea hasta que el método se haya completado y el resultado esté disponible. [10] El AsyncResultobjeto normalmente proporciona al menos un método que permite al cliente consultar si el método de larga ejecución ya se ha completado:

interfaz IAsyncResult { bool HasCompleted () }     

También se puede pasar un método de devolución de llamada a BeginAccomplish, para que se invoque cuando se complete el método de larga duración. Normalmente, se llama EndAccomplishpara obtener el valor de retorno del método de larga duración. Un problema con el mecanismo de devolución de llamada es que la función de devolución de llamada se ejecuta naturalmente en el hilo de trabajo (en lugar de en el hilo de llamada original), lo que puede provocar condiciones de carrera. [11] [12]

En la documentación de .NET Framework, el término patrón asincrónico basado en eventos se refiere a un estilo de API alternativo (disponible desde .NET 2.0) que utiliza un método llamado AccomplishAsyncen lugar de BeginAccomplish. [13] [14] Una diferencia superficial es que en este estilo el valor de retorno del método de larga ejecución se pasa directamente al método de devolución de llamada. Mucho más importante, la API utiliza un mecanismo especial para ejecutar el método de devolución de llamada (que reside en un objeto de evento de tipo AccomplishCompleted) en el mismo hilo en el que BeginAccomplishse llamó. Esto elimina el peligro de condiciones de carrera, lo que hace que la API sea más fácil de usar y adecuada para componentes de software; por otro lado, esta implementación del patrón viene con una sobrecarga adicional de creación y sincronización de objetos. [15]

Referencias

  1. ^ "Invocación de método asincrónico". Programación distribuida con Ice . ZeroC, Inc. Archivado desde el original el 5 de enero de 2008. Consultado el 22 de noviembre de 2008 .
  2. ^ Vermeulen, Allan (junio de 1996). "Un patrón de diseño asincrónico". Diario del Dr. Dobb . Consultado el 22 de noviembre de 2008 .
  3. ^ Nash, Trey (2007). "Subprocesamiento en C#". Accelerated C# 2008. Apress. ISBN 978-1-59059-873-3.
  4. ^ Lavender, R. Greg; Douglas C. Schmidt . «Active Object» (PDF) . Archivado desde el original (PDF) el 22 de julio de 2012. Consultado el 22 de noviembre de 2008 . {{cite journal}}: Requiere citar revista |journal=( ayuda )
  5. ^ "Clase FutureTask". Oracle. 2011. Archivado desde el original el 25 de junio de 2013. Consultado el 29 de junio de 2015 .
  6. ^ "Modelo de programación asincrónica". Microsoft. 2015. Consultado el 29 de junio de 2015 .
  7. ^ "Descripción general del patrón asincrónico basado en eventos". Microsoft. 2015. Consultado el 29 de junio de 2015 .
  8. ^ "Patrón asincrónico basado en tareas". Microsoft. 2015. Consultado el 29 de junio de 2015 .
  9. ^ "Patrones de diseño de programación asincrónica". Guía del desarrollador de .NET Framework . Microsoft Developer Network. Archivado desde el original el 22 de noviembre de 2008. Consultado el 22 de noviembre de 2008 .
  10. ^ "Descripción general de la programación asincrónica". Guía del desarrollador de .NET Framework . Microsoft Developer Network. Archivado desde el original el 7 de diciembre de 2008. Consultado el 22 de noviembre de 2008 .
  11. ^ "Uso de un delegado AsyncCallback para finalizar una operación asincrónica". Guía del desarrollador de .NET Framework . Microsoft Developer Network. Archivado desde el original el 23 de diciembre de 2008. Consultado el 22 de noviembre de 2008 .
  12. ^ "Problemas de concurrencia". Programación distribuida con Ice . ZeroC, Inc. Archivado desde el original el 28 de marzo de 2008. Consultado el 22 de noviembre de 2008 .
  13. ^ Christian Nagel; Bill Evjen; Jay Glynn; Karli Watson y Morgan Skinner (2008). "Patrón asincrónico basado en eventos". Professional C# 2008. Wiley. págs. 570–571. ISBN 9780470191378.
  14. ^ "Programación multiproceso con el patrón asincrónico basado en eventos". Guía del desarrollador de .NET Framework . Microsoft Developer Network. Archivado desde el original el 25 de diciembre de 2008. Consultado el 22 de noviembre de 2008 .
  15. ^ "Decidir cuándo implementar el patrón asincrónico basado en eventos". Guía del desarrollador de .NET Framework . Microsoft Developer Network. Archivado desde el original el 22 de noviembre de 2008. Consultado el 22 de noviembre de 2008 .

Lectura adicional