Python vs Java - ¿Qué elegirías para hacer la programación concurrente y por qué? [cerrado]

StackOverflow https://stackoverflow.com/questions/1861457

Pregunta

Además, si no Python o Java, a continuación, le recoger de manera más general un lenguaje de tipo estático o un lenguaje de tipo dinámico?

¿Fue útil?

Solución

Yo elegiría la JVM sobre pitón, principalmente debido a múltiples hilos en Python se ve impedida por el Global intérprete de bloqueo . Sin embargo, Java es poco probable que sea su mejor cuando se ejecuta en la JVM. Clojure o Scala (utilizando actores) son tanto probable que sea más adecuada a los problemas de subprocesos múltiples.

Si elige Java que debería considerar el uso de la java.util.concurrent bibliotecas y evitar primitivas multi-threading como sincronizada .

Otros consejos

Stackless Python ! Que una variante del pitón hecha especialmente para la concurrencia.

Pero al final depende de la plataforma de destino y lo que está tratando de lograr.

Para concurrencia, me gustaría utilizar Java. Mediante el uso de Java, de hecho me refiero Scala , que toma prestado una gran cantidad de construcciones de concurrencia de Erlang, pero es (probablemente ) más accesible a un desarrollador de Java que nunca ha utilizado antes.

Los hilos de Python sufren de tener que esperar a que el intérprete de bloqueo global, haciendo concurrencia real (dentro de un mismo proceso) inalcanzable para los programas vinculados a la CPU. Según tengo entendido, sin apilado Python resuelve algunas (aunque no todas) de las deficiencias de concurrencia de CPython, pero como yo no lo he utilizado, no puede aconsejar realmente en él.

No creo que el argumento es sobre la elección de idioma o tipos estáticos o dinámicos - es entre dos modelos de concurrencia - memoria compartida y paso de mensajes. ¿Qué modelo tiene más sentido en su situación y no el idioma elegido le permiten hacer una elección o está obligado a adoptar un modelo sobre el otro?

¿Por qué no echar un vistazo a Erlang (que tiene tipado dinámico) y paso de mensajes , Actor modelo , y se lee por qué Joe Armstrong no le gusta la memoria compartida . También hay una interesante discusión sobre la concurrencia de Java usando las cerraduras y las discusiones aquí en SO .

No sé sobre Python, pero Java, junto con las cerraduras incorporadas y el modelo de hilos, tiene un marco mesasge paso llamado Kilim .

Si no Java / Python me gustaría ir para un lenguaje funcional desde que tomó en cuenta los efectos secundarios es una de las complejidades de la escritura de software concurrente. (En cuanto a tu pregunta va: éste pasa a ser escrita a máquina estática, pero compilador infered mayor parte del tiempo)

En lo personal me volvería a escoger F #, ya que he visto un montón de buenos ejemplos de software de escritura concurrente con facilidad utilizarlo.

A modo de introducción: este hombre es igual de divertido como inspirador , incluso una debe haber visto si no está interesado en F # lo que nunca.

Me gustaría utilizar Java, a través de Jython. Java tiene capacidades de hilo fuerte, y puede ser escrito usando la sintaxis de Python con Jython, por lo que tiene lo mejor de los dos mundos.

Python en sí no es muy buena, con la concurrencia, y es más lento que el de Java de todos modos.

Sin embargo, si usted tiene problemas de concurrencia y manos libres, me gustaría echar un vistazo a Erlang, ya que ha sido diseñado para este tipo de problemas. Por supuesto, debe tener en cuenta Erlang sólo si tiene:

  • tiempo para dominar una (muy) nuevas tecnologías
  • el control sobre una parte razonable de la cadena de producción, desde Erland necesitan algunas adaptaciones en su caja de herramientas para adaptarse a

Ni. programación concurrente es notoriamente difícil de conseguir correcta. Existe la opción de utilizar un lenguaje de programación orientado a procesos como Occam-pi que está basado de la idea de comunicación de procesos secuenciales y la pi cálculo . Esto permite que el tiempo de compilación comprobación de punto muerto y muchos otros problemas que surgen durante el desarrollo de sistemas concurrentes. Si no te gusta Occam-pi, que te puede culpar si no, podría intentar ir el nuevo lenguaje de Google, que también implementa una versión de CSP.

Para algunas tareas, Python es demasiado lento. El programa Java solo hilo podría ser más rápido que la versión concurrente de Python en un equipo multi-core ...

Me gustaría usar Java o Scala, F # o simplemente ir a C ++ (MPI y OpenMPI).

El entorno Java (JVM + bibliotecas) es mejor para la concurrencia de (C) Python, pero el lenguaje Java chupa. Probablemente me iría con otra lengua en la JVM - Jython ya se ha mencionado, y Clojure y Scala ambos tienen un excelente soporte para la concurrencia.

Clojure es particularmente bueno - que tiene soporte para estructuras de datos persistentes de alto rendimiento, agentes y memoria transaccional. Es un lenguaje dinámico, pero le puede dar consejos que tipo de conseguir un rendimiento tan bueno como Java.

este video en InfoQ por Richard Hickey ( creador de Clojure) sobre los problemas con los enfoques tradicionales de la concurrencia, y cómo lo maneja Clojure.

me vería en Objective-C y el Marco de la Fundación. la programación asincrónica, concurrente está bien provista.

Por supuesto, esto depende de su acceso a las herramientas de desarrollo o gnustep de Apple, pero si usted tiene acceso a cualquiera de los dos es una buena ruta a tomar con la programación concurrente.

La respuesta es que depende. Por ejemplo estás tratando de tomar ventaja de varios núcleos o CPUs en una sola máquina o está esperando para distribuir su tarea a través de muchas máquinas? ¿Qué tan importante es la velocidad frente a la facilidad de implementación?

Como se ha mencionado antes, Python tiene el intérprete de bloqueo global, pero se podía utilizar el multiprocesamiento módulo. Tenga en cuenta que, si bien Stackless es muy fresco, que no va a utilizar múltiples núcleos por su propia cuenta. Python se considera generalmente más fácil de trabajar que el Java. Si la velocidad es una prioridad Java es generalmente más rápido.

La biblioteca java.util.concurrent en Java hace que escribir aplicaciones simultáneas en una sola máquina más simple pero No obstante, deberá sincronizar alrededor de cualquier estado compartido. Mientras que Java no es necesariamente el mejor lenguaje para la concurrencia, hay una gran cantidad de herramientas, bibliotecas, documentación y mejores prácticas por ahí para ayudarle.

Uso de paso de mensajes y la inmutabilidad en lugar de hilos y estado compartido es considerado el mejor enfoque para la programación de aplicaciones concurrentes. Los lenguajes funcionales que desalientan la mutabilidad y los efectos secundarios son a menudo preferidos como resultado. Si la distribución de sus aplicaciones simultáneas a través de múltiples máquinas es un requisito, es digno de mirar los tiempos de ejecución diseñados para este ejemplo Erlang o Actores Scala .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top