首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python线程同步

Python线程同步
EN

Stack Overflow用户
提问于 2016-08-27 11:57:38
回答 1查看 109关注 0票数 0

我有一个基类,它有一个名为Update的空方法。这个Update方法是由X个不同子类继承的,基类每30次调用一次Update方法(现在不是。它现在只是在循环中做,但我计划让它每隔30分钟打一次电话。)每个子类都有自己的方法Update和自己的一组指令。它很好用。然而,有一个问题,那就是所有的线程都冲突在一起。当它们在python中打印消息时,它们就混合在一起。

我已经对它做了一些研究,但从我所发现的情况来看,它把我搞糊涂了。我所要做的就是让obj1、obj2和obj3的输出都有自己的线路,而不是粉碎在一起。

这是我目前的代码

代码语言:javascript
复制
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')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-27 12:16:25

您需要的是一个semaphore,它是一个多线程锁对象.(programming)

在幼儿园或学前教育中,你有时会看到同样的原则,在哪里上厕所,你需要拿一条项链或另一件东西来表示厕所没有人占用。

信号量对象有两个传统上称为PV的操作。P操作请求锁。如果锁是当前采取的,线程将等待直到锁成为空闲。V操作将释放锁,让另一个线程有机会获得锁。PV是荷兰语"plaatsen“en "vrijgeven”("put“和”plaatsen“)的缩写。

在python中,可以使用threading.Semaphore()_thread.request_lock()工厂函数创建信号量对象。结果对象有两个方法:acquire (=P)和release (=V)。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39180883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档