你好伙伴Overflowers,这是我坚持的另一个代码。 我正在使用装饰器来运行一些函数。
file:async.py
from threading import Thread
from functools import wraps
def run(func):
@wraps(func)
def async_func(*args, **kwargs):
func_hl = Thread(target=func, args=args, kwargs=kwargs)
func_hl.daemon = False
func_hl.start()
return func_hl
return async_func
然后:
import async
[...]
@async.run
def foo():
while condition:
do_something()
但现在我用QT和那些QThreads制作了一个项目。
所以,问题是:我应该如何改进我的装饰者对QT友好? 到目前为止我的努力是这样的:
def better_thread(to_wrap):
class MyThread(QtCore.QThread):
def run(self, *args, **kwargs):
_res = to_wrap(*args, **kwargs)
return _res
@wraps(to_wrap)
def async_func(*args, **kwargs):
def finish():
pass
mythread = MyThread()
mythread.start()
result = mythread.run(*args, **kwargs)
return result
return async_func
我相信的是丑陋和错误的。你能帮帮我吗?
答案 0 :(得分:2)
首先在这里:Threading in a PyQt application: Use Qt threads or Python threads?,对于一些有用的建议。
一个简单的重构"你的代码,使它更清洁:
class Runner(QtCore.QThread):
def __init__(self, target, *args, **kwargs):
super().__init__()
self._target = target
self._args = args
self._kwargs = kwargs
def run(self):
self._target(*self._args, **self._kwargs)
def run(func):
@wraps(func)
def async_func(*args, **kwargs):
runner = Runner(func, *args, **kwargs)
# Keep the runner somewhere or it will be destroyed
func.__runner = runner
runner.start()
return async_func
修改强>
一个简单的测试:
@run
def test():
sleep(1)
print('TEST')
test()
sleep(2)
print('END')