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,并且由于初始化器与超类。请注意,这是在导入类时发生的,甚至没有被代码使用。
您得到的错误是因为Timer
不是类,而是Python 2中的函数/方法: threading.py
>>> from threading import Timer
>>> type(Timer)
<type 'function'>
Run Code Online (Sandbox Code Playgroud)
具体的课程是_Timer
。此外,您的代码确实存在一些问题。你的初始化缺少参数和target
,args
,kwargs
和interval
未设置。
您可能对此很幸运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)
6
1秒后打印。