2016-08-27 11 views
0

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') 

答えて

1

です。 https://en.wikipedia.org/wiki/Semaphore_(programming)

幼稚園や幼稚園では、トイレに行く場所と同じ原則が見られることがあります。ネックレスやその他の物を持ってトイレを使わないようにする必要があります。

セマフォオブジェクトには、従来、PVという2つの操作があります。 P操作はロックを要求します。ロックが現在行われている場合、スレッドはロックが解放されるまで待機します。 V操作はロックを解放し、別のスレッドにロックを取ることができます。 PおよびVは、オランダ語の「plaatsen」en「vrijgeven」(「put」および「release」)の略語です。

pythonでは、threading.Semaphore()または_thread.request_lock()ファクトリ関数を使用してセマフォオブジェクトを作成できます。結果オブジェクトには、acquire(= P)とrelease(= V)の2つのメソッドがあります。

import _thread 
class BaseClass(object): 
    lock = _thread.request_lock() 
    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.lock.acquire() 
      self.Update() 
      self.lock.release() 


    def Update(self): 
     #This is a place holder. 
     #It stops classes that dont have a Update function crashing when called 
     pass 
+0

OK]をクリックして今では交霊会の多くを作成し、それは私がlookign午前exsatley何であるように聞こえるので、それは次のようになりますと仮定イムのために**何か**のような 'トゥルー中: threading.Semaphore.acquire( ) self.Update() threading.Semaphore.release() ' これはスレッドモジュールの一部です。 _threadモジュールにapposedされています。サイトから私はスレッドモジュールを研究していますが、私は最初に混乱してしまったのです。だから私は古い_threadモジュールを使用しています。 – skyzzle

+0

'_thread'だけを使いたいなら、' _thread.allocate_lock() 'を使うことができます。ロックオブジェクトには、 'acquire'と' release'メソッドもあります。 –