'thread._local'对象没有属性

时间:2013-12-17 17:21:04

标签: python multithreading logging thread-exceptions

我试图通过添加上下文过滤器来更改日志记录格式。我的格式是这样的

FORMAT = "%(asctime)s %(VAL)s %(message)s"

这是我用来设置格式的VAL的类。

class TEST:
  def __init__(self, val):
    self.test_var=threading.local()
    self.test_var.value=val
  def filter(self,record):
    record.VAL=self.test_var.value
    return True
  def setValue(self,val)
    self.test_var.value=CMDID

它在单线程环境中工作正常,但对于某个多线程环境,我收到错误

<Fault 1: "exceptions.AttributeError:'thread._local' object has no attribute 'value'">

谁能告诉我这里有什么问题?以及如何纠正?

3 个答案:

答案 0 :(得分:2)

嗯,异常是告诉您thread._local返回的threading.local()对象没有value属性,您可以将val分配给dir(self.test_var)。您可以在self.test_var=threading.local()行之后添加['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__'] 来确认。这对我来说是这样的:

help(threading.local())

确实,value会向您显示确实存在的方法和属性 - self.test_var.__setattr__('value',val) 不在其中。

如果您尝试添加新属性,那么您可能需要:

{{1}}

这实际上会创建属性并为其赋值。

实例属性通常不是通过分配给它们来创建的,就像非实例变量一样......

答案 1 :(得分:0)

局部线程的属性是每个线程的。如果在一个线程上创建TEST对象,在另一个线程上运行筛选器,则会出现此错误。

我不太清楚你要做什么。如果确定要线程本地存储,则可以在访问之前使用hasattr来检查属性。

尝试一下:

  def filter(self,record):
    if not hasattr(self.test_var, 'value'):
      self.test_var.value = 'some default var'
    record.VAL=self.test_var.value
    return True

答案 2 :(得分:0)

  1. 在系统中卸载Keras版本

    pip uninstall keras
    
  2. 安装keras版本2.2.5

    pip install keras==2.2.5
    

对我有用。