Bavarder/src/threading.py

33 lines
822 B
Python
Raw Normal View History

2023-05-26 00:45:08 +05:30
import threading
2023-05-26 12:36:44 +05:30
import sys
2023-05-26 00:45:08 +05:30
class KillableThread(threading.Thread):
def __init__(self, *args, **keywords):
threading.Thread.__init__(self, *args, **keywords)
self.killed = False
2023-07-19 19:29:17 +05:30
2023-05-26 00:45:08 +05:30
def start(self):
self.__run_backup = self.run
2023-07-19 19:29:17 +05:30
self.run = self.__run
2023-05-26 00:45:08 +05:30
threading.Thread.start(self)
2023-07-19 19:29:17 +05:30
2023-05-26 00:45:08 +05:30
def __run(self):
sys.settrace(self.globaltrace)
self.__run_backup()
self.run = self.__run_backup
2023-07-19 19:29:17 +05:30
2023-05-26 00:45:08 +05:30
def globaltrace(self, frame, event, arg):
if event == 'call':
return self.localtrace
else:
return None
2023-07-19 19:29:17 +05:30
2023-05-26 00:45:08 +05:30
def localtrace(self, frame, event, arg):
if self.killed:
if event == 'line':
2023-08-20 15:30:57 +05:30
raise Exception("Killed")
2023-05-26 00:45:08 +05:30
return self.localtrace
2023-07-19 19:29:17 +05:30
2023-05-26 00:45:08 +05:30
def kill(self):
2023-07-19 19:29:17 +05:30
self.killed = True