Improve error handling (#433)
This commit is contained in:
@@ -29,7 +29,7 @@ from sglang.lang.ir import (
|
||||
SglVarScopeBegin,
|
||||
SglVarScopeEnd,
|
||||
)
|
||||
from sglang.utils import encode_image_base64
|
||||
from sglang.utils import encode_image_base64, get_exception_traceback
|
||||
|
||||
|
||||
def run_internal(state, program, func_args, func_kwargs, sync):
|
||||
@@ -195,6 +195,7 @@ class StreamExecutor:
|
||||
self.variable_event = {} # Dict[name: str -> event: threading.Event]
|
||||
self.meta_info = {} # Dict[name: str -> info: str]
|
||||
self.is_finished = False
|
||||
self.error = None
|
||||
|
||||
# For completion
|
||||
self.text_ = "" # The full text
|
||||
@@ -310,17 +311,39 @@ class StreamExecutor:
|
||||
self.backend.end_program(self)
|
||||
|
||||
def _thread_worker_func(self):
|
||||
error = None
|
||||
|
||||
while True:
|
||||
expr = self.queue.get()
|
||||
if expr is None:
|
||||
self.queue.task_done()
|
||||
break
|
||||
|
||||
self._execute(expr)
|
||||
try:
|
||||
self._execute(expr)
|
||||
except Exception as e:
|
||||
print(f"Error in stream_executor: {get_exception_traceback()}")
|
||||
error = e
|
||||
break
|
||||
self.queue.task_done()
|
||||
if self.stream_text_event:
|
||||
self.stream_text_event.set()
|
||||
|
||||
# Clean the queue and events
|
||||
if error is not None:
|
||||
try:
|
||||
while True:
|
||||
self.queue.task_done()
|
||||
self.queue.get_nowait()
|
||||
except queue.Empty:
|
||||
pass
|
||||
for name in self.variable_event:
|
||||
self.variable_event[name].set()
|
||||
if self.stream_var_event:
|
||||
for name in self.stream_var_event:
|
||||
self.stream_var_event[name].set()
|
||||
self.error = error
|
||||
|
||||
if self.stream_text_event:
|
||||
self.stream_text_event.set()
|
||||
|
||||
@@ -679,7 +702,9 @@ class ProgramState:
|
||||
return self.stream_executor.messages()
|
||||
|
||||
def sync(self):
|
||||
return self.stream_executor.sync()
|
||||
ret = self.stream_executor.sync()
|
||||
self.error = self.stream_executor.error
|
||||
return ret
|
||||
|
||||
def text_iter(self, var_name: Optional[str] = None):
|
||||
if self.stream_executor.stream:
|
||||
@@ -769,6 +794,9 @@ class ProgramState:
|
||||
def __setitem__(self, name, value):
|
||||
self.set_var(name, value)
|
||||
|
||||
def __contains__(self, name):
|
||||
return name in self.stream_executor.variables
|
||||
|
||||
def __del__(self):
|
||||
self.stream_executor.end()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user