Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
困惑的是,像python、ruby这样的语言是单线程的吗?比如说java?(适用于网络应用程序)_Java_Python_Ruby_Multithreading - Fatal编程技术网

困惑的是,像python、ruby这样的语言是单线程的吗?比如说java?(适用于网络应用程序)

困惑的是,像python、ruby这样的语言是单线程的吗?比如说java?(适用于网络应用程序),java,python,ruby,multithreading,Java,Python,Ruby,Multithreading,我在读Clojure是如何“酷”的,因为它的语法+它在JVM上运行,所以它是多线程的等等 那么像ruby和python这样的语言本质上是单线程的吗?(作为web应用程序运行时) python/ruby和运行在tomcat上的java之间的根本区别是什么 web服务器不是在所有情况下都有一个线程池吗?当然,web服务器将有一个线程池。那只是在你的程序控制之外。这些线程用于处理HTTP请求。每个HTTP请求都在一个单独的线程中处理,当关联的HTTP响应完成时,该线程被释放回池中。如果Web服务器没有

我在读Clojure是如何“酷”的,因为它的语法+它在JVM上运行,所以它是多线程的等等

那么像ruby和python这样的语言本质上是单线程的吗?(作为web应用程序运行时)

python/ruby和运行在tomcat上的java之间的根本区别是什么


web服务器不是在所有情况下都有一个线程池吗?

当然,web服务器将有一个线程池。那只是在你的程序控制之外。这些线程用于处理HTTP请求。每个HTTP请求都在一个单独的线程中处理,当关联的HTTP响应完成时,该线程被释放回池中。如果Web服务器没有这样的池,它的服务速度会非常慢


一种编程语言是单线程的还是多线程的,取决于使用所讨论的语言以编程方式生成新线程的可能性。如果这是不可能的,那么语言是单线程的,例如PHP。就我所见,Ruby和Python都支持多线程。

大多数语言不定义单线程或多线程。通常,这由库来实现

尽管如此,有些语言在这方面比其他语言好。例如,CPython在多线程处理期间存在解释器锁定问题,而Jython(在JVM上运行的python)则没有

Clojure(IMO)的一些真正功能在于它在JVM上运行。您可以免费获得多线程和大量库。

Ruby


Ruby解释器是单线程的,也就是说它的一些方法不是线程安全的

在Rails世界中,这一个线程主要被推送到服务器上。因此,您将看到nginx运行在一个混合服务器池中,每个服务器在内存中都有一个解释器,一次处理一个请求,并且在自己的线程中

乘客,running将垃圾收集的概念和一些线程安全引入Rails,这很好


Rails在这方面还有很多工作要做,但进展缓慢——但一般来说,我们的想法是拥有多个服务和服务器。

如何解开所有这些线程中的结

Clojure并没有发明线程,但是它通过软件事务性内存、原子、代理、并行映射操作等为线程提供了特别强大的支持

所有其他线程都已积累了线程支持。Ruby是一个特例,因为它在一些实现中有绿色线程,这是一种软件模拟线程,并且不使用所有核心。1.9将解决这一问题

关于web服务器,不,它们并不总是多线程工作,apache传统上是作为一群守护进程运行的,这些守护进程是一个单独的单线程进程池。现在有更多的选项来运行apache服务器

总而言之,所有现代语言都以某种形式支持线程


较新的语言(如scala和clojure)正在添加特定的支持,以改进在没有显式锁定的情况下使用多线程的工作,因为这传统上是多线程的一大陷阱。

Python和Ruby都完全支持多线程。有些实现(例如CPython、MRI、YARV)实际上无法并行运行线程,但这是这些特定实现的限制,而不是语言的限制。这与Java类似,Java中也有一些实现无法并行运行线程,但这并不意味着Java是单线程的

请注意,在这两种情况下都有很多可以并行运行线程的实现:PyPy、IronPython、Jython、IronRuby和JRuby只是其中的几个例子


一方面,PythRoice与Python、Ruby、java、C++、C++、C、PHP等几乎不同,另一方面主流语言不是主流,但Culjure有一个明智的并发模型。所有其他语言都使用线程,我们知道线程是一个糟糕的并发模型至少有40年了。Clojure OTOH有一个sane更新模型,它不仅可以向程序员展示一个sane并发模型,而且可以向程序员展示多个sane并发模型:原子更新、软件事务内存、异步代理、并发感知线程本地全局变量、未来、承诺、,数据流并发性,将来可能会更高。

简单的回答是肯定的,它们是单线程的

答案很长,这要视情况而定

JRuby是多线程的,可以像其他java代码一样在tomcat中运行。MRI(默认的ruby)和Python都有一个GIL(全局解释器锁),因此都是单线程的

web服务器的工作方式因可用服务器配置的数量而变得更加复杂。对于大多数ruby应用程序,有(至少)两个级别的服务器,一个是代理/静态文件服务器,如nginx,然后是ruby应用服务器

Nginx不使用apache或tomcat之类的线程,它使用非阻塞事件(我认为是forked worker进程)。这使得它能够处理比本机线程的开销和调度效率低所允许的更高级别的并发

不同的ruby应用服务器也以不同的方式工作,在没有线程的情况下获得高吞吐量和并发性。Thin使用libev和Nginx等异步事件模型。Mongrel使用工作进程的循环池。Unicorn使用本机Unix IPC(在套接字上选择)通过一个主代理套接字对分叉进程池进行负载平衡

线程只是解决并发性的一种方法。多进程和事件模型是一种与Unix基础紧密结合的不同方法。这与Java对待世界的方式有着根本的不同。

CPython有一个可以降低m的性能的方法