Python 为什么threading.Event是函数而不是类?
对于我正在进行的项目,我们使用python 2.7。 我需要在两个踏板之间实现同步,一个发出信号,另一个等待。为此,我使用了Python 为什么threading.Event是函数而不是类?,python,multithreading,python-2.7,events,Python,Multithreading,Python 2.7,Events,对于我正在进行的项目,我们使用python 2.7。 我需要在两个踏板之间实现同步,一个发出信号,另一个等待。为此,我使用了threading.Event。我通过它的构造函数将这个事件对象注入另一个对象(比如说另一个类的实例)。在另一个类的构造函数中我想验证输入参数,所以我检查了它的类型是否是threading.Event的实例。这就是我感到惊讶的地方,因为这失败了 代码如下所示: from threading import Event class AnotherClass(object):
threading.Event
。我通过它的构造函数将这个事件对象注入另一个对象(比如说另一个类的实例)。在另一个类的构造函数中
我想验证输入参数,所以我检查了它的类型是否是threading.Event的实例。这就是我感到惊讶的地方,因为这失败了
代码如下所示:
from threading import Event
class AnotherClass(object):
def __init__(self, event):
if not isinstance(event, Event):
raise ValueError("event is not instance of threading.Event"):
...
event = Event()
another_object = AnotherClass(event) # raises exception
当我开始调试这个问题时,我发现threading.Event
实际上是一个返回threading实例的函数
>>> from threading import Event
>>> Event
<function Event at 0x0000000002B529E8>
>>> e = Event()
>>> e
<threading._Event object at 0x0000000002AE0358>
来自线程导入事件的>>
>>>事件
>>>e=事件()
>>>e
在python文档页面上,它声明它是一个类。
在我看来,这似乎不合逻辑。例如,threading.Thread的情况并非如此。它实际上是一个类,并且具有构造函数:
>>> Thread
<class 'threading.Thread'>
>>> dir(Thread)
['_Thread__bootstrap', '_Thread__bootstrap_inner', '_Thread__delete', '_Thread__exc_clear', '_Thread__exc_info', '_Thread__initialized', '_Thread__stop', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_block', '_note', '_reset_internal_locks', '_set_daemon', '_set_ident', 'daemon', 'getName', 'ident', 'isAlive', 'isDaemon', 'is_alive', 'join', 'name', 'run', 'setDaemon', 'setName', 'start']
>>线程
>>>目录(线程)
“U线程”的删除,“U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U线程,U引导,U线程,U线程,U线程,U引导,内部,内部,内,内,U线程,U线程,内,U线程,U线程,U线程,U线程,U线程,U线程,引导,内部,内部,内部,内部,内部,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内,内","模块","新模块","减少模块","减少模块","减少模块","减少模块","报告模块","设置属性",__sizeof_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
当然,我可以省略此检查,并让代码在稍后对传递的对象调用某个不存在的方法时失败,但我希望此代码尽快失败
因此,总结一下我的问题:
有人能解释一下执行线程化.Event
的原因吗?我不知道在线文档是怎么回事,但您发布的屏幕截图是针对类线程化的。_Event
,尽管它说是针对类线程化.Event
<代码>线程。事件
是一个工厂函数,返回线程的实例。_Event
。我认为这是非常不直观的,特别是因为文档在threading.Event
和threading.\u Event
之间没有印刷上的区别,您有权感到困惑。这是一个说明线程化的页面。Event
是一个工厂函数(true),它还说明查看实际上是类线程化的“事件对象”。\u Event
s,并且在文档中被错误地描述为类线程化。Event
我在谷歌上搜索了一下,看起来这些文档已经以这种方式被破坏很多年了
线程事件是在Python的后续版本中合理创建的