我花了最后一小时(s ???)查找/谷歌搜索方法让一个类在一个新的线程中启动其中一个方法,一旦它被实例化。
我可以运行这样的东西:
x = myClass()
def updater():
while True:
x.update()
sleep(0.01)
update_thread = Thread(target=updater)
update_thread.daemon = True
update_thread.start()
更优雅的方法是让课程在实例化时在 init 中完成。 想象一下,该课程有10个实例...... 到目前为止,我找不到这个问题的(工作)解决方案...... 实际的类是一个计时器,该方法是一个更新所有计数器变量的更新方法。由于此类还必须在给定时间运行函数,因此主线程不会阻止时间更新。
非常感谢任何帮助。 Thx提前......
答案 0 :(得分:15)
在这种特定情况下,您可以直接从Thread子类化
from threading import Thread
class MyClass(Thread):
def __init__(self, other, arguments, here):
super(MyClass, self).__init__()
self.daemon = True
self.cancelled = False
# do other initialization here
def run(self):
"""Overloaded Thread.run, runs the update
method once per every 10 milliseconds."""
while not self.cancelled:
self.update()
sleep(0.01)
def cancel(self):
"""End this timer thread"""
self.cancelled = True
def update(self):
"""Update the counters"""
pass
my_class_instance = MyClass()
# explicit start is better than implicit start in constructor
my_class_instance.start()
# you can kill the thread with
my_class_instance.cancel()
答案 1 :(得分:2)
要在线程中运行函数(或成员函数),请使用:
th = Thread(target=some_func)
th.daemon = True
th.start()
将此与从Thread
派生的比较,它的优点是您不会将所有Thread的公共函数导出为自己的公共函数。实际上,您甚至不需要编写类来使用此代码,self.function
或global_function
在此处同样可用作target
。
我还考虑使用上下文管理器来启动/停止线程,否则线程可能会保持活动时间超过必要时间,导致资源泄漏和关闭时出错。由于您要将其放入类中,请在__enter__
中启动该主题并在__exit__
中加入该主题。