问题
有时候想给某个函数开个线程, 但是根据网上的教程用threading开线程首先要继承一个线程类, 然后重写几个函数, 麻烦得一批.
不就给函数开个线程嘛, 如果能像Golang那样一个go f()
就好了
背景
装饰器
python的装饰器得是一个可调用对象, 一般为函数, 其返回时一般也应为可调用对象
在函数定义或类定义时可以使用装饰器, 类如下:
@装饰器
def 被装饰的函数(参数):
...
以上语法实际上等价于
def 被装饰的函数(参数):
...
被装饰的函数 = 装饰器(被装饰的函数)
开线程
使用threading
库可以开线程, 具体步骤略, 可以参考菜鸟教程等
正文
装饰器定义如下
def ThreadMaker(f):
def runner(*args, **argv):
t = threading.Thread(target=f, args=args, kwargs=argv)
t.start()
return t
return runner
之后给要开线程的函数头部加上@ThreadMaker
@ThreadMaker
def f(a):
for i in range(10):
time.sleep(1)
print(a)
之后在主线程只要像往常一样调用这些函数就可以自动开线程了
f('a'); f('b')
输出如下
ba
b
a
ab
ba
ab
ba
a
b
a
b
ba
ab