如何在Python中从线程子类传递自定义函数

0 投票
1 回答
1368 浏览
提问于 2025-04-17 17:33

我有这段代码

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 就能执行了。

另外,你没有把 argskwargs 传给 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']

注意你传给构造函数的 argskwargs 实际上可以通过 kwargs['args']kwargs['kwargs'] 来访问。

撰写回答