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()的初始非线程调用因任何原因失败(即,如果任何“做某事”位失败),我希望程序能够很难。如果后来的线程调用失败,我只想记录它并继续尝试,直到其中一个线程调用成功。
我想我会尝试检测方法是否在线程中执行,但我不确定如何继续。
答案 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
上努力工作。走下“检测线”的道路可能非常棘手,导致不可预测的问题。