在Python中在单独线程上创建类实例并访问其方法

1 投票
2 回答
2371 浏览
提问于 2025-04-18 13:52

在我现在的代码中,我想创建一个在单独线程中运行的类。之所以想让这个类在独立的线程上运行,是因为它需要处理很多占用性能的任务。同时,我还有其他类需要访问这个独立线程中类的方法。下面是我想实现的一个例子:

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())

撰写回答