在Python中在单独线程上创建类实例并访问其方法
在我现在的代码中,我想创建一个在单独线程中运行的类。之所以想让这个类在独立的线程上运行,是因为它需要处理很多占用性能的任务。同时,我还有其他类需要访问这个独立线程中类的方法。下面是我想实现的一个例子:
import thread
class ClassInThread:
def __init__(self, obj)
self.obj = obj
def getObj():
return self.obj
class NormalClass:
def __init__(self):
self.obj = None
def setObj(self, obj):
self.obj = obj
classOne = thread.start_new_thread(ClassInThread, (12,))
classTwo = NormalClass()
classTwo.setObj(classOne.getObj())
这个例子不管用,因为当新线程被创建时,它并没有返回ClassInThread的实例。我该怎么做才能让它工作呢?
2 个回答
0
你可以在主程序里创建一个类,并保持对这个类的引用。然后你可以使用这个类的方法来创建一个线程,我猜这个方法是跟输入输出有关的。Python的线程主要在处理输入输出比较繁重的情况时比较有用。如果你的程序是处理器繁忙,那你应该考虑使用多进程。
在访问在线程服务中被修改的类属性时要小心,因为这样可能会导致冲突。解决这个问题的方法是使用锁(就像C语言中的互斥锁一样)。
import threading
class ClassInThread:
def __init__(self, obj)
self.obj = obj
self.run_event = threading.Event()
self.run_event.set()
def getObj(self):
return self.obj
def run_heavy_service(self):
while self.run_event.is_set():
time.sleep(5)
print "Serving"
def kill(self):
self.run_event.clear()
class NormalClass:
def __init__(self):
self.obj = None
def setObj(self, obj):
self.obj = obj
classOne = ClassInThread(12)
classTwo = NormalClass()
threaded_IO_bound_proc = threading.Thread(target = classOne.run_heavy_service)
threaded_IO_bound_proc.start()
classTwo.setObj(classOne.getObj())
2
你应该使用 threading
模块,而不是 thread
模块。因为 thread
模块是一个比较底层的线程接口,通常不建议使用。
使用 threading
模块,你可以这样做:
import threading
class ClassInThread(threading.Thread):
def __init__(self, obj)
self.obj = obj
def getObj(self):
return self.obj
def run(self):
pass
# This method is what is executed in a separate thread when you call classOne.start() below. You should implement it.
class NormalClass(object):
def __init__(self):
self.obj = None
def setObj(self, obj):
self.obj = obj
classOne = ClassInThread(12)
classOne.start() # starts the thread
classTwo = NormalClass()
classTwo.setObj(classOne.getObj())