コールバックメソッド(イベントハンドラ)で作成されたグローバル状態変数を作成しようとしています。 しかし、コールバックは別のメモリ位置にコピー(深い)を作成しますが、他の方法では(もちろん)見られません。ここで 状況python:別のスレッドからグローバル変数に書き込むと、コピーが作成されます
class Server:
def __init__(self):
self.callbacks=[]
#create a web server instance to listen to requests
self.app=Flask("test")
def add_callback(self, func):
self.calbacks.append(func)
self.app.add_url_rule("/test", "test", self.handle_http_request)
def handle_http_request(self):
content = request.get_json(silent=True)
for ca in self.callbacks:
ca(content)
def start_server(self):
#some stuff starting flask here...
class SomeModule:
def __init__(self):
self.ws=Server()
self.ws.add_callback(self.callback)
self.callback_called=False
def callback(self, content):
print "callback executing---"
print "var addr before callback assign: "+str(hex(id(self.callback_called)))
self.callback_called=True
print "var addr after callback assign: "+str(hex(id(self.callback_called)))
def start(self):
self.ws.start()
#send a request to the server using the request library, which invokes all the trigger
#check the state variable:
print "var addr before check: "+str(hex(id(self.callback_called)))
if (not self.callback_called):
raise Exception("error...")
if __name__ == '__main__':
sm=SomeModule()
sm.start()
は出力がされている。
callback executing--- var addr before callback assign: 0x927910 var addr before callback assign: 0x927930 var addr before check: 0x927910
誰も私にこれを回避するためにどのような方法を提案することはできますか? C++ではポインタとmutexにアクセスする方法を明確にしています。ここでは、私は変数の安全な書き込みを行うための方法を見つけるために管理していない...
ありがとうたくさんの事前に!
私は変数を交換します。ありがとうございましたself.callback_calledはdictでメモリ検査は実際に同じ位置を示しますが、varibaleがeg.''self.callback_called ['done'] = True'''に設定されていても、私は何かが分かっていないような感じ.... :( – mojovski
@mojovskiあなたはprinですか?変数をすばやく調整しますか?私のテストでは完璧に動作するからです。 https://gist.github.com/で試用コードを貼り付けることができますか? – Torxed