我应该在 class 方法中加入或退出线程 class

Should I put a threading class in or out of a class method

我正在创建一个 class,其中的几个方法使用线程。

为了使用线程,我经常创建线程的子 class。我应该像这样在顶层创建的线程:

class mainclass(object):

    def __init__(self, ):
        pass

    def method_a(self, ):
        print('method_a start')
        tlist = list(range(10))
        ps = [subthread(tlist) for i in range(4)]
        for p in ps:
            p.start()
        for p in ps:
            p.join()
        print('method_a finish', tlist)


class subthread(threading.Thread):

    def __init__(self, alist):
        threading.Thread.__init__(self)
        self.alist = alist

    def run(self, ):
        while self.alist:
            t = self.alist.pop(0)
            print(self.getName(), t)
            sleep(1)

或者像这样使用它的方法:

class mainclass(object):

    def __init__(self, ):
        pass

    def method_a(self, ):
        class subthread(threading.Thread):

            def __init__(self, alist):
                threading.Thread.__init__(self)
                self.alist = alist

            def run(self, ):
                while self.alist:
                    t = self.alist.pop(0)
                    print(self.getName(), t)
                    sleep(1)

        print('method_a start')
        tlist = list(range(10))
        ps = [subthread(tlist) for i in range(4)]
        for p in ps:
            p.start()
        for p in ps:
            p.join()
        print('method_a finish', tlist)

据我所知,如果我使用第二种,class方法可能会很长, 似乎 jedi.vim 不能正常工作。

如果我使用第一个,对于每个 class 方法,我都必须创建一个顶层 class,名称不同,我只在一个地方使用。

那么我应该使用哪个?

您真的不需要创建 class。如果它所做的只是运行一个方法,你可以通过target参数直接将方法传递给Threadclass:

class Main(object):

    def run(self, alist, thread_id):
        while alist:
            t = alist.pop(0)
            print(thread_id, t)
            sleep(1)

    def method_a(self):
        print('method_a start')
        tlist = list(range(10))
        ps = [Thread(target=self.run, args=(tlist, i)) for i in range(4)]
        for p in ps:
            p.start()
        for p in ps:
            p.join()
        print('method_a finish')