我应该在类方法中放入线程类吗?

时间:2015-09-17 12:55:40

标签: multithreading python-3.x subclass

我正在创建一个类,其中有几种方法使用线程。

要使用线程,我经常创建一个子线程的线程。我应该在顶级创建的线程如下:

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)

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

如果我使用第一个,对于每个类方法,我必须创建一个具有不同名称的顶级类,我只在一个地方使用。

那我该使用哪个?

1 个答案:

答案 0 :(得分:0)

你真的不需要创建一个类。如果它只是运行一个方法,你可以通过目标参数将方法直接传递给Thread类:

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