在我当前的代码中,我试图创建一个在单独的线程中创建的类。我希望这个类在它自己的线程上,因为它做了很多性能很重的事情。我还有其他类需要在单独的线程上访问我想要的类中的方法。以下是我希望能够做到的一个例子:
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实例。我怎样才能做到这一点?
答案 0 :(得分:1)
您应该使用threading
模块而不是thread
模块。 thread
模块是较低级别的线程API,通常不应该使用。
使用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())
答案 1 :(得分:0)
您可以在主程序中创建该类,并保留对该类的引用。然后你可以使用类方法创建一个线程,我认为这是IO密集型的。 Python线程主要在IO绑定情况下有用。如果你是处理器绑定的,你应该看看多处理。
请注意访问在线程服务中修改的类属性,因为这可能会导致冲突。解决这个问题的方法是使用锁(如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 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())