我有一个基类,它有一个名为Update的空方法。这个Update方法是由X个不同子类继承的,基类每30次调用一次Update方法(现在不是。它现在只是在循环中做,但我计划让它每隔30分钟打一次电话。)每个子类都有自己的方法Update和自己的一组指令。它很好用。然而,有一个问题,那就是所有的线程都冲突在一起。当它们在python中打印消息时,它们就混合在一起。
我已经对它做了一些研究,但从我所发现的情况来看,它把我搞糊涂了。我所要做的就是让obj1、obj2和obj3的输出都有自己的线路,而不是粉碎在一起。
这是我目前的代码
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')发布于 2016-08-27 12:16:25
您需要的是一个semaphore,它是一个多线程锁对象.(programming)。
在幼儿园或学前教育中,你有时会看到同样的原则,在哪里上厕所,你需要拿一条项链或另一件东西来表示厕所没有人占用。
信号量对象有两个传统上称为P和V的操作。P操作请求锁。如果锁是当前采取的,线程将等待直到锁成为空闲。V操作将释放锁,让另一个线程有机会获得锁。P和V是荷兰语"plaatsen“en "vrijgeven”("put“和”plaatsen“)的缩写。
在python中,可以使用threading.Semaphore()或_thread.request_lock()工厂函数创建信号量对象。结果对象有两个方法:acquire (=P)和release (=V)。
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
passhttps://stackoverflow.com/questions/39180883
复制相似问题