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

2022-08-31 15:38:04

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

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

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

Web 服务器不是在所有情况下都有一个线程池可以使用吗?


答案 1

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

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

一方面是Clojure与Python,Ruby,Java,C#,C++,C,PHP以及几乎所有其他主流和非主流语言之间的主要区别在于,Clojure具有合理的并发模型。所有其他语言都使用线程,我们已经知道这是一个糟糕的并发模型至少40年。Clojure OTOH有一个合理的更新模型,它不仅允许它向程序员呈现一个,而且实际上向程序员呈现多个合理的并发模型:原子更新,软件事务内存,异步代理,并发感知线程局部全局变量,期货,承诺,数据流并发性,将来可能更多。


答案 2

一个令人困惑的问题,有很多令人困惑的答案...

首先,线程和并发执行是两回事。Python支持线程就好了;它不支持在任何实际实现中并发执行。(在所有严肃的实现中,一次只能执行一个 VM 线程;许多分离 VM 线程的尝试都失败了。

其次,这与Web应用程序无关。您不需要Python后端在同一进程中并发执行。您为每个后端生成单独的进程,然后每个后端可以并行处理请求,因为它们根本不绑定在一起。

将线程用于Web后端是一个坏主意。为什么要将线程的危险 - 锁定,竞争条件,死锁 - 引入固有的令人尴尬的并行性?将每个后端塞入其自己的隔离进程中要安全得多,从而避免了所有这些问题的可能性。

(共享内存空间有好处 - 它通过共享静态代码来节省内存 - 但这可以在没有线程的情况下解决。


推荐