我读到了Clojure是如何“酷”的,因为它的语法+它运行在JVM上,所以它是多线程的,等等。
像ruby和python这样的语言本质上是单线程的吗?(作为web应用程序运行时)。
python/ruby和运行在tomcat上的java之间的潜在区别是什么?
web服务器不是在所有情况下都有一个线程池可以使用吗?
发布于 2010-06-22 00:45:06
CPython有一个Global Interpreter Lock,它可以降低多线程代码的性能。在某些情况下,最终的结果是线程实际上不能同时运行,因为锁争用。并不是所有的Python实现都使用GIL,因此这可能不适用于JPython、IronPython或其他实现。
该语言本身确实支持线程和其他异步操作。python库还可以在内部支持线程,而无需将其直接暴露给Python解释器。
如果你听说过任何关于Python和线程的负面消息(或者它不支持它),那很可能是有人遇到了GIL导致瓶颈的情况。
发布于 2010-06-22 00:43:55
简短的回答是肯定的,它们是单线程的。
长篇大论的答案是这要看情况。
JRuby是多线程的,可以像其他java代码一样在tomcat中运行。MRI (默认ruby)和Python都有一个GIL (全局解释器锁),因此是单线程的。
它在web服务器上的工作方式由于可用服务器配置的数量而变得更加复杂。对于大多数ruby应用程序来说,(至少)有两级服务器,一个代理/静态文件服务器,比如nginx,然后是ruby应用服务器。
Nginx不像apache或tomcat那样使用线程,它使用非阻塞事件(我认为是forked worker进程)。这使得它能够处理比本地线程的开销和调度效率低所允许的更高级别的并发。
不同的ruby应用服务器也以不同的方式工作,以获得高吞吐量和不需要线程的并发。Thin使用libev和异步事件模型,如Nginx。Mongrel使用工作进程的循环调度池。独角兽使用本地Unix IPC (在套接字上选择)通过一个主代理套接字将负载平衡到派生进程池。
线程只是解决并发性的一种方法。多进程和事件模型是一种与Unix基础很好地绑定在一起的不同方法。这从根本上不同于Java对待世界的方式。
发布于 2010-06-22 00:40:27
大多数语言没有定义单线程或多线程。通常,这是留给库来实现的。
也就是说,一些语言在这方面比其他语言做得更好。例如,CPython在多线程期间有解释器锁定的问题,而Jython (在JVM上运行的python)则没有。
Clojure (IMO)的一些真正强大之处在于它在JVM上运行。你可以免费获得多线程和大量的库。
https://stackoverflow.com/questions/3086467
复制相似问题