在一个单独的线程上创建一个类实例,同时仍然能够在python中访问它的方法
在我当前的代码中,我试图创建一个在单独线程中创建的类。我希望这个类有自己的线程,因为它做了许多高性能的事情。我还有其他类需要在单独的线程上访问我想要的类中的方法。以下是我希望能够做到的一个例子:在一个单独的线程上创建一个类实例,同时仍然能够在python中访问它的方法,python,multithreading,python-2.7,Python,Multithreading,Python 2.7,在我当前的代码中,我试图创建一个在单独线程中创建的类。我希望这个类有自己的线程,因为它做了许多高性能的事情。我还有其他类需要在单独的线程上访问我想要的类中的方法。以下是我希望能够做到的一个例子: import thread class ClassInThread: def __init__(self, obj) self.obj = obj def getObj(): return self.obj class NormalClass:
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实例。如何使其工作?您可以在主程序中创建类并保留对该类的引用。然后您可以使用类方法创建一个线程,我假设它是IO密集型的。Python线程主要在IO绑定的情况下很有用。如果您受处理器限制,那么应该考虑多处理 访问在线程化服务中修改的类属性时要小心,因为可能会导致冲突。解决这个问题的方法是使用锁(如C中的互斥) 您应该使用模块而不是
线程
模块。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())
如果我保持原样运行,整个类还会在自己的线程下运行吗?@Chandler类对象本身不在自己的线程中
Thread
对象允许您通过运行Thread\u obj.start()
在单独的线程中执行对象的run
方法。调用start
使run
在新线程中执行,并且从run
内部调用的任何方法也将在该新线程中执行。但是如果从主线程调用classOne.getObj()
,则getObj
仍在主线程中执行。即使在主线程中调用classOne.run()
,它仍然会在主线程中执行。只有通过调用classOne.start()
才能获得新的执行线程。
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())