我应该在 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')
我正在创建一个 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')