2009-12-07 12 views
8

また、pythonやjavaでない場合は、より一般的に静的型言語または動的型言語を選択しますか?PythonとJavaの違い - 並行プログラミングを選択する理由とその理由は何ですか?

+4

あなたはErlangを考慮しましたか? – jldupont

+7

私は、型システムは、並行性のためにうまくいくものとはほとんど関係がないと思います。それには他のものが必要です。 – Joey

+6

私がJavaを使うほど、Pythonがもっと好きです。私?うんざり?なぜ聞くのですか? – retracile

答えて

25

PythonでのマルチスレッドがGlobal Interpreter Lockによって妨げられているため、主にPythonでJVMを選択します。しかし、JVM上で実行しているときにJavaがベストであるとは限りません。 ClojureまたはScala(アクターを使用)は、両方ともマルチスレッドの問題に適している可能性があります。

Javaを選択する場合は、java.util.concurrentライブラリを使用し、などのマルチスレッドプリミティブを使用することを検討する必要があります。

+4

グローバルインタプリタロックの問題は、複数のインタプリタを持つだけで解決されます。D http://docs.python.org/dev/library/multiprocessing.html – badp

+1

マルチスレッドは確かに並行性の唯一の方法ではありません –

+1

If Javaを使用し、「Java Concurrency in Practice」を取得し、それを処理するのに3〜4ヶ月を費やす準備をします。並行性は、どの言語でも問題になります。 –

11

Definetely Stackless Python!これは、特に並行性のために作られたPythonの変形です。

最終的には、ターゲットプラットフォームと達成しようとしているものによって異なります。

4

Java/Pythonでない場合は、ファンクショナル言語を使用します。これは、副作用を考慮することは、並行ソフトウェアを作成する複雑さの1つです。 (あなたの質問が行く限り、これは統計的に型付けされていますが、コンパイラはほとんどの場合推論します)

個人的に私はF#を選びます。それ。

紹介:この男はequally fun as inspiringです。あなたがF#に興味を持っていない場合でも、これは必見です。

+0

F#はpythonとjavaとは完全に**異なっていることに注意してください。それは.netを知る必要があり、純粋な機能です。 –

+1

F#は純粋な機能ではなく、機能コードの行を記述することなく、任意のプログラムを書くことができます。 – Peter

5

引数は言語の選択や静的または動的な型付けに関するものではありません。共有メモリとメッセージの受け渡しの2つのモデルの間にあります。どちらのモデルがあなたの状況でより意味をなさないのですか&あなたの選択した言語はあなたに選択を許しますか、あるいは一方のモデルを他方のモデルに採用することを余儀なくされていますか?

Erlang(動的タイピングがあります)とmessage passingActor modelとを読んで、なぜJoe Armstrong doesn't like shared memoryと表示されるのはなぜですか?また、ロックとスレッドを使用してJavaの並行性についての興味深い議論がありますhere on SO

私はPythonについてはわかりませんが、Javaはinbuiltのロックとスレッドモデルとともに、Kilimと呼ばれるメソージュを渡すフレームワークを持っています。

2

私はJython経由でJavaを使用します。 Javaには強力なスレッド機能があり、PythonのJython構文を使用して記述することができるため、2つの世界の中で最高のものが得られます。

Python自体は並行処理ではあまりうまくいかず、Javaより遅いです。

しかし、並行性の問題とフリーハンドがある場合は、そのような問題の設計がされているのでErlangを見てください。もちろん、あなたが持っている場合にのみ、アーランを考慮する必要があります。Erlandを合わせてツールボックスのいくつかの適応を必要とするので、生産チェーンの合理的な部分に(非常に)新しい技術

  • コントロールをマスターする

    • 時間を
  • +0

    @ user359996あなたのコメントは、Jythonが並行処理を処理できないという印象を一部の人に与えるかもしれません。それは、Javaのようにすることができます。私はJythonを愛しています。なぜなら、Pythonのセマンティクスと組み合わされたSwingなど、あらかじめ設計されたすべてのJavaクラスの能力を与えるからです。私は、GUIの本質がマルチスレッドであるために、Pythonで単純なGUIをどのように扱うのか不思議です...私はJythonで大きな成果を上げました...本当に速いモジュールは、Javaで書かれ、 .. –

    9

    並行性については、Javaを使用します。 Javaを使用すると、実際にはScalaという意味になりますが、これはErlangの並行性構造から多くを借りていますが、これまでに使用したことのないJava開発者にとって(おそらく)

    Pythonスレッドはグローバルインタープリタロックを待たなければならないため、CPUバインドされたプログラムで真の同時実行性(単一のプロセス内で)が達成できなくなります。私が理解しているように、Stackless PythonはCPythonの並行性の欠点をいくつか解決していますが、それを使用していないため、実際にはアドバイスできません。

    1

    一部のタスクでは、Pythonの速度が遅すぎます。あなたのシングルスレッドのJavaプログラムは、マルチコアコンピュータ上のPythonの同時バージョンよりも速くなる可能性があります。

    JavaまたはScala、F#を使用したいのですが、単にC++(MPIとOpenMPI)に行きます。

    1

    Java環境(JVM +ライブラリ)は(C)Pythonよりも同時実行性に優れていますが、Javaでは言語が嫌です。私はおそらくJVM上で別の言語を使うでしょう - Jythonはすでに言及されていますが、ClojureとScalaはどちらも並行性の優れたサポートを持っています。

    Clojureは特に優れています。これは、高性能永続データ構造、エージェント、およびソフトウェアトランザクションメモリをサポートしています。これは動的な言語ですが、Javaと同等のパフォーマンスを得るためのヒントをタイプすることができます。

    Concierrencyに対する従来のアプローチの問題と、Clojureがそれをどのように処理するかについて、Richard Hickey(Clojureの作成者)がInfoQについて尋ねます。

    1

    私はObjective-CとFoundation Frameworkを見ていきたいと思います。非同期、並行プログラミングが十分に提供されています。

    もちろん、アップルのデベロッパーツールやGnuStepへのアクセスにも依存しますが、どちらにもアクセスできるのであれば、並行プログラミングではうまくいくでしょう。

    2

    どちらもありません。並行プログラミングは、正解を得るのが難しいことが知られています。 communicating sequential processespi calculusの考え方に基づくoccam-piのようなプロセス指向プログラミング言語を使用するオプションがあります。これにより、同時システム開発中に発生するデッドロックや他の多くの問題のコンパイル時間チェックが可能になります。あなたがしなければ私があなたを非難するoccam-piが好きでないなら、GoもCSPのバージョンを実装しているgoogleから新しい言語を試すことができます。

    +0

    デッドロックのコンパイル時のチェック?私はそれがどのように働くか研究するのが好奇心です – Setzer

    1

    答えはそれが依存するということです。たとえば、1台のマシンで複数のコアまたはCPUを利用しようとしているか、多くのマシンにタスクを分散したいのですか?スピードと実装の容易さはどれくらい重要ですか?

    前述のとおり、Pythonにはグローバルインタープリタロックがありますが、multiprocessingモジュールを使用できます。 Stacklessは非常にクールですが、won't utilise multiple coresは単独で使用できます。 Pythonは通常、Javaよりも扱いやすいと考えられています。速度が優先順位の場合、Javaは通常より高速です。

    Javaのjava.util.concurrentライブラリを使用すると、1台のマシンで同時アプリケーションを簡単に作成できますが、それでも共有状態を同期させる必要があります。 Javaは必ずしも同時実行のための最良の言語ではありませんが、そこには多くのツール、ライブラリ、ドキュメント、ベストプラクティスがあります。

    スレッドと共有状態の代わりにメッセージパッシングと不変性を使用する方が、並行アプリケーションをプログラミングする方が優れています。変更可能性と副作用を妨げる機能的言語は、結果としてしばしば好まれる。複数のマシンにまたがって並列アプリケーションを配布する必要がある場合は、このために設計されたランタイムを検討する価値があります。 ErlangまたはScala Actorsです。

    関連する問題