扩展threading.Timer以从函数返回值给出TypeError

Fer*_*iro 6 python multithreading python-2.x

我试图扩展threading.Timer,以便可以从函数中获取返回值。我使用了该线程的解决方案并进行了修改(因为Timer()已经带有* args和** kwargs了,我认为我不需要__init__再次传递它了)。代码完全像这样:

from threading import Timer

class CustomTimer(Timer):
    def __init__(self):
        super(CustomTimer, self).__init__()
        self._return = None

    def run(self):
        super(CustomTimer, self).run()
        self._return = self._Thread__target(*self._Thread__args, **self._Thread__kwargs)

    def join(self):
        super(CustomTimer, self).join()
        return self._return
Run Code Online (Sandbox Code Playgroud)

然后我在运行主模块时遇到以下错误:

Traceback (most recent call last):
  File "main.py", line 43, in <module>
    from storage import *
  File "/home/mei/tmwAthena/manamarket/storage.py", line 13, in <module>
    from utils import ItemDB
  File "/home/mei/tmwAthena/manamarket/utils.py", line 142, in <module>
    class CustomTimer(Timer):
TypeError: Error when calling the metaclass bases
    function() argument 1 must be code, not str
Run Code Online (Sandbox Code Playgroud)

我不明白这个错误,因为function()非常简单,它接收到* self.args和** self.kwargs,并且由于初始化器与超类。请注意,这是在导入类时发生的,甚至没有被代码使用。

Ant*_*ala 5

您得到的错误是因为Timer不是类,而是Python 2中函数/方法 threading.py

>>> from threading import Timer
>>> type(Timer)
<type 'function'>
Run Code Online (Sandbox Code Playgroud)

具体的课程是_Timer。此外,您的代码确实存在一些问题。你的初始化缺少参数和targetargskwargsinterval未设置。

您可能对此很幸运CustomTimer

from threading import _Timer

class CustomTimer(_Timer):
    def __init__(self, interval, function, args=[], kwargs={}):
        self._original_function = function
        super(CustomTimer, self).__init__(
            interval, self._do_execute, args, kwargs)

    def _do_execute(self, *a, **kw):
        self.result = self._original_function(*a, **kw)

    def join(self):
        super(CustomTimer, self).join()
        return self.result
Run Code Online (Sandbox Code Playgroud)

演示:

def add_together(a, b):
    return a + b

c = CustomTimer(1, add_together, (2, 4))
c.start()
print c.join()
Run Code Online (Sandbox Code Playgroud)

61秒后打印。