16

私は数ヶ月前にPythonの勉強を始め、それからJythonを見つけました。

JythonにはGILがないため、スレッドは正しく機能しますか?もしそうなら、並行性(スレッド化)に関する良い本を提案できますか?

4

4 に答える 4

7

マルチスレッドで出会った最高の本は「JavaConcurrencyinPractice」です。これはJavaスレッドの並行性に非常に集中しており、並行性によってもたらされる問題と可能性を理解し始めると、謙虚で刺激的なものになります。数年前に購入したコピーには、コーディングに正誤表が含まれていましたが、これはすでに頭の痛い問題を悪化させました。ここで正誤表を確認してください:http: //jcip.net/errata.html

並行性に挑戦したいJava開発者向けに設計されていますが(ちなみに、これまでにあらゆる種類のGUIインターフェースを使用したことがある人も含まれます)、この本で概説されている技術的な難しさと微妙さは、並行性の実装に当てはまると確信しています。

ちなみに、私もJythonが大好きで、Javaで実行できる並行性に関しては、明らかにJythonで実行できることを確認できます。ただし、注意点があります。並行性は、非同期プログラミング(GUIを含む)および/またはパフォーマンスのためのものである可能性があります。後者の場合、私の意見では、問題が発生します。私の経験では、Jythonの実行速度は同等のJavaプログラムの約10倍です。

これが意味することは、より要求の厳しいJythonモジュールは、数を処理するタスクのためにJython以外のものを呼び出さなければならないということです。同時に、これまでJython *にはPythonのマルチプロセッシングモジュールがなかったため、RMIの恐ろしい領域に足を踏み入れない限り、プロセス間通信は利用できません。あなたがそのオプションをとるなら、あなたは私よりも男性/女性です。しかし、すべて問題ありません。http://www.jython.orgの「TheDefinitive Guide to Jython」を参照してください...第19章は、並行性の一種のホイッスルストップイントロであり、第10章はJavaとJythonの統合に関するものです(ヒント:それはとてつもなく簡単です)。

  • 興味深い:Jythonサイトをざっと見ると、ちょうど10日前の17/05/12にバージョン2.7a1がリリースされたことがわかります...「Alpha」リリース。これには、Python2.6に付属しているマルチプロセッシングモジュールが含まれている必要があります。これをチェックするのは興味深いでしょう:もしそうなら、おそらくJythonプロセスとCPythonプロセスをリンクするエキサイティングなオプションを提供します(後で更新:残念ながら、今のところそうではないようです-モジュール名「マルチプロセッシング」は試したときに認識されませんでした)..。

PS最後の言葉:ムーアの法則がアムダールの法則に取って代わられていると私が言うよりもはるかに多くのことを知っているほとんどの専門家は、要するに、安定したスケーラブルな真の並行プログラムをプログラミングするという困難な課題が避けられないことを意味します将来。私が言うことはできませんが、この主題への投資と、並行性によって課せられた魅力的で知的な新しい推論の分野は、おそらく報われるでしょう...あなたは挑戦が好きです。

于 2012-05-27T10:46:29.047 に答える
3

はい、Jythonを使用すると、実際のマルチスレッド化が可能になります。Jython(JPythonの後継)は、JVMで実行されるPythonの実装です。Jythonと元のプロジェクトの主な違いの1つは、最初のプロジェクトにはGILがなく、JVMの実装に基づいて実際のマルチスレッドサポートを実装していることです。

この本OReillyの本をご覧になることをお勧めします 。

于 2012-05-15T07:28:27.307 に答える
1

例を挙げて試してみました。

要件:
from rough import print_time
from datetime import datetime

"""
This is actually using python threading package.
One thing I came to know is that if we use the python threading module also, 
internally Jython chnages it to Java thread and work.
"""
# from threading import Thread, InterruptedException

"""
This is the java threading module.
"""
from java.lang import Thread, InterruptedException


"""
Here you can call your module from the run method.
For passing arguments, you can use the constructor of the Cycle class.
"""
class Cycle(Thread):

    def __init__(self,time1=1):
        Thread.__init__(self)
        # arguments for the run method
        self.time1 = time1

    def run(self):
        try:
            # Calling the required module with given arguments
            print_time(self.time1)
        except InterruptedException:
            print("Exception")

if __name__ == '__main__':
    print("start time:",datetime.now())
  
    for i in range(100):
        Cycle(i).start()
        
    print("end time:",datetime.now())

https://github.com/om12nayak/Jython_multithreading_demoで完全なコードを見つけてください

于 2020-12-18T07:07:26.100 に答える
0

最初は紛らわしいのは、 JavaとJythonの並行性メカニズムを組み合わせて組み合わせることができるということかもしれません。しかし、それはすべてうまくいくようです。理由は次のとおりです。

  • Jythonの下には、同じ古いJavaがあります。その堅牢なスレッドメカニズムとデータ構造のすべては、重いJythonの機械の下でも壊れることはありません。
  • Jythonのスレッドは、Javaスレッドをシャーシとして使用し、PythonスレッドAPIを話すように上部構造を追加します。(スレッド化されたPythonコードの移植を容易にするためのより良い方法はありません。)しかし、2つのタイプのスレッドの本質は似ています。Jythonスレッドの場合を除いて

    ...優先順位やスレッドグループはなく、スレッドを破棄、停止、一時停止、再開、または中断することはできません。[1]

Pythonのイディオムは、おそらくもう少し便利です。たとえば、と同等のことをしたい場合synchronized (some_object) { ... }、少し手を加える必要があり、 RLockを使用するよりも読みにくくなる可能性があります。

于 2016-02-12T08:25:45.753 に答える