我已经完成了一些Java编程以及很少的C和PHP编程。最近我开始学习Python,因为语言似乎很有趣。
但SO上的几篇文章似乎指出Python不适合并发编程。与那些拥有编译器的语言相比,它也更慢。我也喜欢静态类型语言的优点,但Python是动态类型的。所以我的问题是,是否有一种语言符合以下标准。
1)有一名翻译(为了加快发展)
2)有编译器(因为编译的代码运行得更快)
3)具有OO能力
4)静态输入
我遇到了满足上述标准的OCaml。但SO上的帖子让我相信OCaml不适合并发编程。所以第五个标准是
5)适合并发编程。
PS: - 我不是编程语言方面的专家,所以如果我上面的任何观察结果有误,请耐心等待。
答案 0 :(得分:5)
是的,OCaml适合并发编程。它有一个Thread
模块,允许您像在Java中一样对网络应用程序进行编程。
请注意,它目前不支持真正的并行性(你不会有两个并行运行OCaml代码的线程),但是无关紧要,因为OCaml比许多其他语言快得多(例如,在QuadCore上,语言大战显示OCaml甚至优于具有多核功能的Haskell。
答案 1 :(得分:5)
OCaml适用于并发编程。标准库支持两种concurrency模型:具有共享内存的线程(mutexes和condition variables用于同步),events基于John Reppy's Concurrent ML。
OCaml不包括对对称多处理器并行性的支持。运行时在单个处理器上执行。如果要利用多核计算机,则需要为每个处理器运行至少一个运行时,并在运行时之间使用消息传递。消息传递具有更高的延迟,但比共享内存更难获得。作为奖励,程序可以分布在网络上的多台计算机上,除了运行时启动时彼此找到的方式之外,不会发生任何变化。
JoCaml是OCaml的扩展,具有更好的并发和分发模型(join calculus)。它不像官方的OCaml发行版那样优雅,但具有提供透明通信(在通道上发送消息而不用担心对方是在同一个运行时还是在同一台机器上)和大多数类型的通信框架的优点多个程序之间。
答案 2 :(得分:3)
根据您对适合并发编程的意思,我建议使用OCaml或SML(标准ML):
请注意,使用任一解决方案,您都将开始使用类型推断!一旦你习惯了它,用任何语言编程都会让你哭泣! ;)
答案 3 :(得分:1)
multiprocessing
模块,它提供api来使用线程等进程。另外在不同的vm下运行的python的实现没有GIL,如果你已经熟悉Java,也许你应该研究Jython,它是一个在JVM上运行的python实现。
同样不明显但值得注意的是Python确实编译为字节代码。它是在第一次导入任何脚本时执行的,这意味着如果编译和导入python源文件,它将被编译一次,所有进一步尝试导入同一模块都会使用字节编译版本,并且不会重新执行脚本。这种行为更像是java而不是PHP,它在每次运行时都会重新解释源代码。
答案 4 :(得分:1)
我想介绍三种语言,这些语言可能在很大程度上满足您正在寻找的所有功能
的Haskell
二郎
erl
用于此目的。Groovy的
最后
如果您想进一步研究,请使用以下wiki链接
答案 5 :(得分:1)
首先考虑其他资源更重要。
1)有一个翻译(为了更快的发展) - imo un true
2)有编译器(因为编译后的代码运行得更快) - 真的吗?如何在开发和服务器机器和部署上使用不同的arch?
3)有OO能力 - 为什么?函数式语言更适合并行编程
4)静态输入 - 为什么?如果它在类型系统中具有“null”值,那么这个和非静态类型的imo之间没有区别。
更好的标准是
社区的质量是什么:)
Ocaml是一种很棒的语言,使用Lwt库,即使在轻松处理1个进程的情况下也可以执行异步代码。 Ocaml也很快!这似乎是很好的解决方案,但是你没有很多生产就绪的框架。
Erlang拥有库,它很酷,速度快,似乎是满足您需求的最佳解决方案。
Ruby和Ruby On Rails不会让你轻松编写并发代码,但你可以快速构建解决方案并开始赚钱:)我的意思是比其他语言快10倍因为你有准备好的块。在这种情况下,部署也是最简单的。
Node.js速度快,易于拾取语言(javascript)但是开发的早期阶段因此没有多少生产就绪的东西。
现在这就是我处理解决方案的方式:
就业绩而言,您的交易是
CPU上限
此上下文中的Node.js和Rails是内存上限,Rails将在生产时每个工作人员平均消耗~250mb ram。 Ocaml / Oscigen,Erlang / Webmachine是CPU上限,大多数功能语言将走这条路。
我使用i5 CPU https://gist.github.com/1996858在macbook pro上对webmachine进行了小测试 这个资源每次都从redis中提取简单的json而没有缓存。
100万个请求 总计:连接1000次请求1000000回复1000000测试持续时间463.413 s
Connection rate: 2.2 conn/s (463.4 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 390.6 avg 463.4 max 3245.7 median 453.5 stddev 101.6
Connection time [ms]: connect 0.1
Connection length [replies/conn]: 1000.000
Request rate: 2157.9 req/s (0.5 ms/req)
现在最好的部分是监控内存使用情况。它大约是19.3 mb ram。
如果你问我,我会在Rails中构建应用程序原型,然后提取json api并使用webmachine在Erlang中构建它们。或者只是使用webmachine在Erlang中构建应用程序,并使用一些像capistrano这样的ruby库的一些不错的功能进行部署:)
答案 6 :(得分:0)
请注意,OCaml程序可以相对轻松地在不同的进程中工作,因为它甚至可以封送闭包。