私は別のスレッドからオブジェクトに登録できる単純なコールバックを作成しようとしています。この場合、コールバックを呼び出す初期オブジェクトは独自のスレッドで実行されています。Python3 weakref WeakMethodとスレッドセーフ
これは最高次の例を通して説明されています
from pprint import pprint
import sys
import weakref
import threading
import time
class DummyController(object):
def __init__(self):
self.name = "fortytwo"
def callback(self):
print("I am number : " + self.name)
class SomeThread(threading.Thread):
def __init__(self, listener):
threading.Thread.__init__(self)
self.listener = listener
def run(self):
time.sleep(1)
dummy = DummyController()
self.listener.register_callback(dummy.callback)
time.sleep(5)
del dummy
class Listener(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.runner = weakref.WeakMethod(self.default_callback)
self.counter = 20
def default_callback(self):
print("Not implemented")
def register_callback(self, function):
self.runner = weakref.WeakMethod(function)
def run(self):
while self.counter:
try:
self.runner()()
except Exception as e:
pprint(e)
self.counter -= 1
time.sleep(1)
listen = Listener()
some = SomeThread(listen)
listen.start()
some.start()
は今、上記のコードは正常に動作します。しかし、ここでは糸の安全性が心配です。 weakref docsを通じて読書、weakrefが本当にラインを除いて、安全かいないスレッドである場合には非常に明確ではありません:thread.lock、threading.Lock、およびコードオブジェクトのサポートが追加されました:
は、バージョン3.2で変更します。
私は単にその権利を読んでいないかもしれません。私は、ロックを追加する必要がありますか、またはすべての実際に細かい、かなりスレッドセーフです?
ありがとうございました
docはバージョン3.2で、thread.lock、threading.Lock、およびcodeオブジェクトを弱参照できますが、内部ロックがあることを意味するわけではありません。そして私はどの部分が安全でないのか分かりません。あなたは説明するための例を挙げることができますか? – Sraw
'Listener'はオブジェクト関数のコールバックを実行しますが、別のスレッド(' SomeThread')がオブジェクトを削除するという事実から心配しています。 'weakref.WeakMethod'を使用しているので、オブジェクトはガベージコレクタの関与なしにメモリから即座に削除されるはずです。オブジェクトが削除されている場合にコールバック関数オブジェクトを削除すると競合状態が発生するかどうかと、同時に呼び出される。 これは少し明確ですか? – karmalis