Update
という空のメソッドを持つ基本クラスがあります。 このUpdate
メソッドはX個の異なるサブクラスによって継承されています 基本クラスはUpdate
メソッドを30ティックごとに1回呼び出します(現在はそれがループで実行されていますが、すぐに刻々と変化します) 各サブクラスには独自の命令Update
があります。 正常です。しかし、1つの問題があり、それはすべてのスレッドが一緒に衝突しているということです。 Pythonシェルでメッセージをプリントアウトすると、一緒にブレンドされます。Pythonスレッド同期
私はそれにいくつかの研究をしましたが、私が見つけたことから、私のことを混乱させています。私がしたいのは、obj1、obj2およびobj3の出力を自分自身の行にまとめ、一緒に壊さないことだけです。
はここにあなたがマルチスレッドロックオブジェクトであるsemaphore
、である必要がありますどのような私の現在のコード
import _thread
class BaseClass(object):
def __init__(self, name):
self.name = name
_thread.start_new_thread(self.UpdateHandler,())
def ClassType(self):
"""Returns a string of the childs type"""
pass
def UpdateHandler(self):
#this part handles when to call the update.
#it is allso needed so that it can be run in a thread.
while True:
self.Update()
def Update(self):
#This is a place holder.
#It stops classes that dont have a Update function crashing when called
pass
#---------------------------------------------------------------------------------
class ChildClassA(BaseClass):
def __init__(self, name):
super(ChildClassA, self).__init__(name)
def ClassType(self):
return 'ChildClassA'
def Update(self):
print(self.name, ": is doing stuff CLASS A")
#----------------------------------------------------------------------------------
class ChildClassB(BaseClass):
def __init__(self, name):
super(ChildClassB, self).__init__(name)
def Update(self):
print(self.name, "This is a completley diffeent action CLASS B")
self.Hi()
def ClassType(self):
return 'ChildClassB'
def Hi(self):
print("Hi")
#----------------------------------------------------------------------------------
class ChildClassC(BaseClass):
def __init__(self, name):
super(ChildClassC, self).__init__(name)
def Update(self):
print(self.name, "This is a completley diffeent action")
#--------------------------------------------------------------------------------
obj1 = ChildClassA('Obj1')
obj2 = ChildClassA('Obj2')
obj3 = ChildClassB('Obj3')
OK]をクリックして今では交霊会の多くを作成し、それは私がlookign午前exsatley何であるように聞こえるので、それは次のようになりますと仮定イムのために**何か**のような 'トゥルー中: threading.Semaphore.acquire( ) self.Update() threading.Semaphore.release() ' これはスレッドモジュールの一部です。 _threadモジュールにapposedされています。サイトから私はスレッドモジュールを研究していますが、私は最初に混乱してしまったのです。だから私は古い_threadモジュールを使用しています。 – skyzzle
'_thread'だけを使いたいなら、' _thread.allocate_lock() 'を使うことができます。ロックオブジェクトには、 'acquire'と' release'メソッドもあります。 –