检测方法是否作为线程执行

时间:2016-03-28 18:45:50

标签: python python-2.7 python-multithreading

class Foo():
    def bar(self):
        try:
            # do something
        except:
            # log and continue
        finally:
            Timer(9001, self.bar()).start()

def main():
    foo = Foo()
    foo.bar()

我的理解是对Foo.bar()的第一次调用将是阻塞,但是然后Foo.bar()将自己的另一个实例产生为一个单独的线程。

如果对Foo.bar()的初始非线程调用因任何原因失败(即,如果任何“做某事”位失败),我希望程序能够很难。如果后来的线程调用失败,我只想记录它并继续尝试,直到其中一个线程调用成功。

我想我会尝试检测方法是否在线程中执行,但我不确定如何继续。

1 个答案:

答案 0 :(得分:0)

通过检查线程本地数据,可以检测您是否仍在同一个线程中:

import threading

class Foo():
    def __init__(self):
        self.thread_flag = object()
        mydata = threading.local()
        mydata.thread_flag = self.thread_flag

    def bar(self):
        mydata = threading.local()
        if hasattr(mydata, 'thread_flag') and mydata.thread_flag is self.thread_flag:
            raise Exception('Fail hard!')
        Timer(9001, self.bar()).start()

请注意,您必须在创建.bar()对象的同一个线程中调用Foo

但我想你可以更容易地跟踪对bar的一些调用。在1上努力工作。走下“检测线”的道路可能非常棘手,导致不可预测的问题。