Python:将函数作为参数和多线程传递

时间:2014-07-23 10:10:02

标签: python multithreading function-parameter

我是python的新手,我无法找到为什么" Without_thread"班级工作,而不是" With_thread"类。

我和#34; With_thread"的目的class是在用函数调用它时启动一个新线程,所以我可以同时执行任何函数。 (< ==这就是我想做的事)

import threading

class With_thread(threading.Thread):
    def __init__(self, target, *args):
        self._target = target
        self._args = args
        threading.Thread.__init__(self)

    def run(self):
        self._target(*self._args)

" Without_thread"几乎是同一个班级,这里唯一改变的是我不会使用线程。

class Without_thread():
    def __init__(self, target, *args):
        self._target = target
        self._args = args

    def foo(self):
        self._target(*self._args)

我用这个来测试我的代码:

def some_Func(data, key):
    print("some_Func was called : data=%s; key=%s" % (str(data), str(key)))

f1 = With_thread(some_Func, [1,2], 6)
f1.start()
f1.join() 

f2 = Without_thread(some_Func, [1,2], 6)
f2.foo()

f1的输出是:

    self._target(*self._args)
TypeError: 'NoneType' object is not callable

f2的输出是:

some_Func was called : data=[1, 2]; key=6

如果你能帮助我,我真的很感激,非常感谢你的时间!

1 个答案:

答案 0 :(得分:2)

怀疑这个问题是由_target和_args之间的某种冲突以及Thread中定义的相同属性引起的。

您无需在With_thread中定义__init__()run()。 Thread类拥有 init 允许您传递关键字参数targetargs,其run()方法将使用在intiialisation提供的args和kwargs运行目标。 / p>

所以,你可以完全摆脱With_thread,然后调用:

f1 = threading.Thread(target=some_Func, args=([1,2], 6))