如何在Python中从线程子类传递自定义函数
我有这段代码
class MyTh(threading.Thread):
def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, verbose=None):
threading.Thread.__init__(self, group=group, target=target, name=name,
verbose=verbose)
self.args = args
self.kwargs = kwargs
return
def run(self):
logging.debug('running with %s and %s', self.args, self.kwargs)
return
def my_func():
print 'Everything OK'
当我这样做的时候
t1 = MyTh(name='Thread '+ str(i), target=myfunc, args=("test",), kwargs={'a':'A', 'b':'B'})
t1.start()
我的目标函数根本没有被调用。我该怎么做才能让我的线程调用目标中给定的默认函数呢?
1 个回答
1
通过重写 run()
方法,你会搞乱标准的 run()
,而且不会调用目标函数。你需要做的是,要么不重写这个方法,要么像这样重写:
def run(self):
logging.debug('running with %s and %s', self.args, self.kwargs)
super(MyTh, self).run()
return
这样一来,标准的 Thread.run
也会被调用,目标函数 target
就能执行了。
另外,你没有把 args
和 kwargs
传给 Thread
的构造函数。你需要这样做:
threading.Thread.__init__(self, group=group, target=target, name=name,
verbose=verbose, args=args, kwargs=kwargs)
这样才能正确设置它们。然后你可以把你的 my_func
改成:
def my_func(arg1, a, b):
print arg1, a, b
print 'Everything OK'
还有,MyTh
的构造函数和调用 Thread.__init__
的代码写得太长了。其实可以更简洁易读:
def __init__(self, *args, **kwargs):
threading.Thread.__init__(self, *args, **kwargs)
self.args = kwargs['args']
self.kwargs = kwargs['kwargs']
注意你传给构造函数的 args
和 kwargs
实际上可以通过 kwargs['args']
和 kwargs['kwargs']
来访问。