无法在 python 装饰中使用线程库获取 func 的参数?



下面是python代码,没有通过从threading.thread继承的类创建的线程就可以了。 例如,通过将目标函数作为 threading.thread(( 的参数来创建线程

import threading ,time
from time import sleep, ctime
import functools
def find(func):
    @functools.wraps(func)
    def wrapper(*args,**kwargs):
        print("ags:%s,%sn" % (args,kwargs))
        return func(*args, **kwargs)
    return wrapper
@find
def now() :
    return str( time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime() ) )
class myThread (threading.Thread) :
    """docstring for myThread"""
    @find
    def __init__(self, nloop, nsec) :
        super(myThread, self).__init__()
        self.nloop = nloop
        self.nsec = nsec
    @find
    def run(self):
        print('start loop', self.nloop, 'at:', ctime())
        sleep(self.nsec)
        print('loop', self.nloop, 'done at:', ctime())
@find
def main():
    thpool=[]
    print('starting at:', now())
    for i in range(10):
        thpool.append(myThread(i,2))
    for th in thpool:
        th.start()
    for th in thpool:
        th.join()
    print('all Done at:', now())
if __name__ == '__main__':
    main()

我收到错误信息如下:

File "F:questionmultithreadfmclass.py", line 15, in wrapper
    print("ags:%s,%sn" % (args,kwargs))
  File "D:ProgramFilesPython352libthreading.py", line 813, in __repr__
    assert self._initialized, "Thread.__init__() was not called"
AssertionError: Thread.__init__() was not called

如何删除错误? 提前。

在初始化之前打印Thread对象,这是不可能的。由于您的装饰器,找到此错误并不容易,但是如果您先调用func,那么它可以工作:

def find(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print("ags:%s,%sn" % (args, kwargs))
        return result
return wrapper

最新更新