concurrency - programacion - listas en lisp ejemplos
ProgramaciĆ³n paralela de Common Lisp (4)
Compruebe los hilos de Burdeos si está buscando una única interfaz de estilo de hilos POSIX para primitivas de subprocesos múltiples para diferentes Lisps.
Si estuviera buscando una implementación Lisp gratuita y confiable, comenzaría con CCL y luego probaría SBCL. Utilizo CCL para casi todas mis pruebas y SBCL y LispWorks para el resto.
La biblioteca de futuros de Sedach debería proporcionar una interfaz de nivel superior. También hay algunas otras contribuciones de varios usuarios en el directorio contrib de SBCL.
Esto viene de alguien que no ha utilizado ni la biblioteca de futuros de Sedach ni los hilos de Burdeos y ha escrito su propia versión de ambos. Podría enviarte mi implementación, pero se supone que estos dos paquetes también son buenos y probablemente sean un mejor punto de partida.
Quiero implementar mi algoritmo de filtrado de partículas en paralelo en Common Lisp. El filtrado y muestreo de partículas se puede paralelizar y quiero hacer esto para mi máquina de 4 núcleos. Mi pregunta es si la programación en paralelo es factible en CL o no, y si es factible, ¿hay alguna buena lectura, tutoriales sobre cómo iniciar la computación en paralelo en CL?
Definitivamente es factible!
El proyecto Bordeaux Threads proporciona primitivas de hilo para varias implementaciones; Sugeriría usarlo en lugar de los primitivos específicos de la implementación de SBCL (¡especialmente si no está en SBCL!).
Las primitivas de hilo provistas por bt son, sin embargo, bastante primitivas. He usado y disfrutado de Eager Future2, que se basa en bt para proporcionar funciones de concurrencia utilizando futuros. Puede crear futuros que se calculan perezosamente, con entusiasmo (inmediatamente) o especulativamente. Los futuros especulativos se calculan mediante un grupo de subprocesos cuyo tamaño se puede personalizar.
Comencé un pequeño proyecto para proporcionar versiones paralelas de las funciones de CL usando EF2, pero hasta ahora solo se trata de tres funciones, por lo que no será de mucha utilidad para nadie. Por supuesto, doy la bienvenida a otros programadores para que lo pirateen y envíen solicitudes de extracción, y espero poder trabajar más en el futuro.
Hay muchas otras bibliotecas listadas en Cliki que no he probado yo mismo.
En cuanto a los tutoriales, no conozco ninguno, pero las características de concurrencia proporcionadas también se encuentran en otros idiomas, y los buenos algoritmos y prácticas no son generalmente específicos del idioma.
Si está interesado en leer un libro, recomiendo el lenguaje de programación concurrente C. Los autores describen un nuevo lenguaje de programación, basado en C, con concurrencia como característica del lenguaje. Por supuesto, debido a la naturaleza de CL, probablemente sería posible implementar estas características sin tener que recurrir a la creación de un nuevo compilador. En mi opinión, el libro presenta excelentes conceptos de concurrencia y aborda muchos de los problemas que puede encontrar o dejar de considerar al escribir programas concurrentes.
LispWorks 6 viene con un buen conjunto de primitivas para la programación concurrente.
Tenga en cuenta que, por lo que sé, ninguna de las implementaciones habituales de Common Lisp tiene un recolector de basura simultáneo.
Documentación para LispWorks 6 y Multiprocesamiento.
SBCL tiene algún soporte multihilo. Es un nivel demasiado bajo y, que yo sepa, no incluye ningún algoritmo paralelo. Tiene la posibilidad de crear subprocesos que ejecutan alguna función lambda y luego probar si el subproceso ha terminado (uniéndolo). Utilicé ese soporte para generar mis páginas de blog con gran aceleración (cada página o conjunto de páginas en un hilo diferente). Puedes ver el código aquí:
https://github.com/dsevilla/functional-mind-blog/blob/master/blog/process.lisp
Por ejemplo, generar un hilo para cada página fue algo así como:
#+sbcl
(defun generate-post-pages ()
(map nil
#''(lambda (post)
(make-thread (lambda () (page-generation-function post))))
*posts*))
También puedes join-thread
, y tener mutex, etc. Puedes leer la documentación aquí: SBCL Threading . Sin embargo, es demasiado bajo nivel. Terminarás perdiendo las fantásticas características de Clojure para la concurrencia ...