Pythonのロック注釈は、Javaメソッドとの "同期"キーワードと同じ効果をPythonメソッドにも与えていますか?pythonロックメソッドの注釈
13
A
答えて
15
私は組み込みの機能がPythonで存在しないと仮定することができますが、あなたはそれがthisリンクからJavaでどのように機能するかを理解し、それを実装することができます作成
すべてのJavaオブジェクト、すべてのクラスがロードされ を含め、関連するがあります ロックまたはモニタ。 同期ブロック内のコードを置くことは、コンパイラ 追記命令は、コードを実行する 前に指定されたオブジェクトの ロックを取得し、その後それ を解放することができる(いずれかのコードため 終了正常または異常)。 ロックを取得してから を解放するまでの間に、スレッドは がロックを所有していると言います。スレッド ロックを取得したい場合、 スレッドBがすでにそれを所有している場合は、 スレッドAはスレッドBが にリリースされるのを待たなければなりません。ので、多分このような何かが動作することができます
:Javaで
synchronized文:
public class Java {
static private int count = 0;
public void increment() {
synchronized (this) {
count++;
}
}
}
になった:
import threading
class Java:
cout = 0
lock = threading.RLock()
def increment():
with Java.lock:
Java.cout += 1
とJavaでの同期方法:
public class Java {
static private int count = 0;
public synchronized void increment() {
count ++;
}
}
になった:
import threading
def synchronized(method):
""" Work with instance method only !!! """
def new_method(self, *arg, **kws):
with self.lock:
return method(self, *arg, **kws)
return new_method
class Java:
count = 0
lock = threading.RLock()
@synchronized
def incremenet(self):
Java.count += 1
明示的、暗黙よりも優れています。
N.B:私のJava知識は非常に限定されています。このJava機能についての私の講義は、多分私が何かを見逃しているかもしれません。
NB:私が作成したロックはクラス変数なので、クラスレベルで同期が行われるようにします。インスタンスレベルで同期を行いたい場合は、Javaのやり方を考えてください。変化する。
1
は、私は時々、このようデコレータを使用します。しかし、最初に装飾されたメソッドを呼び出すときに
def synchronized(f):
@functools.wraps(f)
def wrapper(self, *args, **kwargs):
try:
_ = self._lock
except AttributeError:
self._lock = threading.Lock()
with self._lock:
return f(self, *args, **kwargs)
return wrapper
このソリューションは、競合状態を持っています。この問題を避ける最も簡単な方法は、最初に他のスレッドが実行されていないときに同期メソッドを呼び出すことです。を手動で割り当てます。__init__
関連する問題
- 1. PythonのPEP8注釈
- 2. Evernote Python APIの表示注釈のタイトル
- 3. Spring mvc注釈検証のカスタム注釈
- 4. 注釈とリソースと自動注釈付き注釈
- 5. Python 3タイプの注釈とサブクラス
- 6. Pythonの3ドキュメント機能注釈
- 7. JPA 2.0フィールド注釈対メソッド注釈
- 8. Morris.jsに注釈/注釈を追加
- 9. Python型注釈:プロパティに注釈を付ける方法はありますか?
- 10. Pythonヒストグラムに注釈を付けるが、注釈が明確でない
- 11. (注釈)
- 12. 注釈
- 13. C++アプリケーションのマルチスレッドのロックメソッド
- 14. python Seaborn - ポイントプロットによる注釈
- 15. サイズイメージピンの注釈
- 16. スウィフトマップキットの注釈
- 17. Nashornの注釈
- 18. ユニットテストの注釈?
- 19. 式の注釈
- 20. Objectifyfilterの注釈
- 21. @IdClass JPA注釈
- 22. Guice @ Nullable注釈
- 23. グループ注釈が
- 24. @Where注釈
- 25. 360ビデオ注釈
- 26. Roboguice Assisted注釈
- 27. BeSimple SoapBundle - 注釈:
- 28. Grails @Mock注釈
- 29. C#データ注釈
- 30. 注釈混乱
コメントありがとうございます。 – paweloque
それはあなたが何をしているかによって異なります。 Pythonは「グローバルインタプリタロック」を持っているため、一度に1つのスレッドしかPythonコードを実行することができず、複数のコアを利用することはできません。しかし、あなたのコードがディスクへのアクセスやネットワークからのデータを待っている場合や、numpyの計算を待っている場合は、マルチスレッドが機能します。 –
ザビエル、ナンセンスを吐き出さないでください。マルチスレッド化は必ずしも悪い考えではありません。それはいくつかのCPUバウンドコードのためにマルチコアシステム上でそのGILのprobsを持っていることを認め...しかし、それは全体のことを "悪い考え"と呼ぶには不十分です。 –