在一个单独的线程上创建一个类实例,同时仍然能够在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())