调整世界执行外部请求逻辑,添加错误返回

调整世界运行逻辑(更新状态存在并发情况,还需继续调整)
This commit is contained in:
walker 2023-11-06 09:25:54 +08:00
parent 8b25469d6e
commit e1a4fb8476
3 changed files with 37 additions and 29 deletions

View File

@ -49,6 +49,12 @@ func (me *EventType[T]) Publish(wd World, event *T) {
})
}
// 内部发布事件(同步发布,并直接触发)
func (me *EventType[T]) internalPublish(wd World, event *T) {
me.et.Publish(wd, *event)
processAllEvents(wd)
}
///////////////////////////////////////////////////////////////////////////////////
// 订阅该类型的事件

View File

@ -26,7 +26,7 @@ func NewErrResult(err error) Result[EmptyType] {
// 请求世界执行给定函数
func Request[T any](w World, handler func() Result[T]) chan Result[T] {
future := make(chan Result[T])
w.Execute(func() {
err := w.Execute(func() {
result := handler()
select {
// 即使外面不接收也不会卡停World运行
@ -34,5 +34,14 @@ func Request[T any](w World, handler func() Result[T]) chan Result[T] {
default:
}
})
// 世界执行错误直接响应错误
if err != nil {
go func() {
select {
case future <- Result[T]{Err: err}:
default:
}
}()
}
return future
}

View File

@ -43,7 +43,7 @@ type (
// 添加系统
AddSystem(sys ...ISystem)
// 在世界中执行处理逻辑(在世界运行线程中)
Execute(fn HandleFunc)
Execute(fn HandleFunc) error
}
// 处理函数
@ -147,11 +147,10 @@ func (w *world) updateState(state WorldState) {
old := w.state
slog.Debug("世界状态变更", "oldstate", old, "state", state)
w.state = state
WorldStateChangeEvent.Publish(w, &WorldStateChange{
WorldStateChangeEvent.internalPublish(w, &WorldStateChange{
OldState: old,
NewState: state,
})
WorldStateChangeEvent.et.ProcessEvents(w)
}
}
@ -186,17 +185,24 @@ func (w *world) StartUp() {
}
// 在世界线程执行逻辑
func (w *world) Execute(fn HandleFunc) {
func (w *world) Execute(fn HandleFunc) error {
if w.state == WorldError {
return fmt.Errorf("世界运行异常,无法执行请求")
} else if w.state != WorldRunning && w.state != WorldPause {
return fmt.Errorf("世界已经关闭,无法执行请求")
}
w.toBeExecuteds <- fn
return nil
}
// 关闭世界
func (w *world) Close() {
if w.state == WorldRunning || w.state == WorldPause {
w.updateState(WorldClose)
w.Execute(func() {
w.updateState(WorldClose)
})
} else if w.state == WorldError {
w.updateState(WorldClosed)
w.handleRequestAndEvent()
}
}
@ -225,6 +231,7 @@ func (w *world) run() {
}
}()
for range w.ticker.C {
slog.Debug("世界运行")
if w.state == WorldClose {
// 世界正常关闭
w.close()
@ -232,7 +239,6 @@ func (w *world) run() {
}
// start := time.Now()
if w.state != WorldRunning { // 世界非运行状态
w.handleRequestAndEvent()
continue
}
if w.times >= 1 {
@ -241,7 +247,10 @@ func (w *world) run() {
for _, sys := range w.systems {
sys.Update(w)
}
w.handleRequestAndEvent()
// 执行待执行逻辑
w.executeTodos()
// 处理所有事件
processAllEvents(w)
}
w.times = w.times - float64(times) + w.speed
} else {
@ -252,21 +261,13 @@ func (w *world) run() {
}
}
// 处理请求和事件执行
func (w *world) handleRequestAndEvent() {
// 执行待执行逻辑
w.executeTodos()
// 处理所有事件
processAllEvents(w)
}
// 世界运行异常处理
func (w *world) exception(err any) {
slog.Error("世界出现异常", "error", err)
// slog.Error("世界运行异常", "error", err, "stack", string(debug.Stack()))
w.updateState(WorldError)
// // 关闭定时器
// w.ticker.Stop()
w.handleRequestAndEvent()
// 关闭定时器
w.ticker.Stop()
// w.handleRequestAndEvent()
}
// 世界正常关闭逻辑
@ -275,13 +276,5 @@ func (w *world) close() {
w.updateState(WorldClosed)
// 关闭定时器
w.ticker.Stop()
go func() {
defer func() {
if err := recover(); err != nil {
slog.Error("世界关闭监听处理可能异常", "error", err)
}
}()
w.handleRequestAndEvent()
}()
slog.Debug("世界关闭finish")
}