是否可以在不设置/检查任何标志/信号量/等的情况下终止正在运行的线程?
根据许多来源,包括这个问题,将可运行作为target参数传递__init__(带或不带argsand kwargs)比扩展类更可取Thread。
如果我创建一个可运行的对象,如何在self不扩展Thread类的情况下传递它正在运行的线程?例如,以下内容可以正常工作:
class MyTask(Thread):
def run(self):
print(self.name)
MyTask().start()
Run Code Online (Sandbox Code Playgroud)
但是,我看不到让这个版本工作的好方法:
def my_task(t):
print(t.name)
Thread(target=my_task, args=(), kwargs={}).start()
Run Code Online (Sandbox Code Playgroud)
这个问题是Python - How can I Implement a 'stoppable' thread? 的后续问题 ,我回答了,但可能不完整。
更新
我想到了一个技巧来使用以下方法来做到这一点current_thread():
def my_task():
print(current_thread().name)
Thread(target=my_task).start()
Run Code Online (Sandbox Code Playgroud)
问题:调用函数来获取理想情况下应该传入的参数。
更新#2
我发现了一个更黑客的解决方案,它看起来current_thread更具吸引力:
class ThreadWithSelf(Thread):
def __init__(self, **kwargs):
args = kwargs.get('args', ())
args = (self,) + tuple(args)
kwargs[args] = args
super().__init__(**kwargs)
ThreadWithSelf(target=my_task).start()
Run Code Online (Sandbox Code Playgroud)
除了极其丑陋之外(例如,通过强制用户仅使用关键字,即使这是文档中推荐的方式),这完全违背了不扩展Thread. …