MGDebugger / timeout_utils.py
learnmlf's picture
Upload 7 files
2680a94 verified
raw
history blame
1.72 kB
import json
import os
from threading import Thread
import resource
import signal
import json
import os
import traceback
from loguru import logger
def set_memory_limit(max_memory):
def limit_memory():
resource.setrlimit(resource.RLIMIT_AS, (max_memory, max_memory))
return limit_memory
def timeout_handler(_, __):
raise TimeoutError()
def to_jsonl(dict_data, file_path):
with open(file_path, 'a') as file:
json_line = json.dumps(dict_data)
file.write(json_line + os.linesep)
class PropagatingThread(Thread):
def run(self):
self.exc = None
try:
if hasattr(self, '_Thread__target'):
# Thread uses name mangling prior to Python 3.
self.ret = self._Thread__target(*self._Thread__args, **self._Thread__kwargs)
else:
self.ret = self._target(*self._args, **self._kwargs)
except Exception as e:
self.exc = e
def join(self, timeout=None):
super(PropagatingThread, self).join(timeout)
if self.exc:
raise self.exc
if self.is_alive():
return None
return self.ret
def terminate(self):
self._stop()
def function_with_timeout(func, args, timeout, max_memory=100 * 1024 * 1024):
result_container = []
def wrapper():
# set_memory_limit(max_memory)()
result_container.append(func(*args))
thread = PropagatingThread(target=wrapper)
thread.start()
thread.join(timeout)
if thread.is_alive():
logger.error(f"Timeout Error\n {args[0]} with timeout {timeout}")
thread.terminate()
raise TimeoutError()
else:
return result_container[0]