在单独的线程上创建类实例,同时仍然能够在python中访问其方法

时间:2014-07-18 17:42:12

标签: python multithreading python-2.7

在我当前的代码中,我试图创建一个在单独的线程中创建的类。我希望这个类在它自己的线程上,因为它做了很多性能很重的事情。我还有其他类需要在单独的线程上访问我想要的类中的方法。以下是我希望能够做到的一个例子:

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 :(得分: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())