Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[部分破坏性更新] 修复部分问题 & 修改client逻辑 & 添加函数 #21

Closed
wants to merge 10 commits into from

Conversation

FishZe
Copy link
Owner

@FishZe FishZe commented Mar 10, 2023

  1. 添加删除Option功能 @FishZe
  2. 添加CountRoom函数 函数返回值类型优化 #18 @XiaoMiku01
  3. 更换websocket库 忽略 .idea 目录,更换 websocket #17 @XiaoMiku01
  4. 修改client逻辑 @FishZe
  5. 修改 GetNewHandler 返回值 函数返回值类型优化 #18 @XiaoMiku01
  6. 修复结构体数据类型错误 结构体类型错误 #19 @XiaoMiku01

@XiaoMiku01
Copy link
Contributor

先别合并,有个地方内存泄露了
CmdBrotliProtoDecoder 这个函数

@FishZe
Copy link
Owner Author

FishZe commented Mar 10, 2023

????诶??????

@FishZe
Copy link
Owner Author

FishZe commented Mar 10, 2023

用的是 brotli 这个库,那只能换个库了...

@XiaoMiku01
Copy link
Contributor

image
这是刚运行的
image
这是运行10分钟后的
房间数基本相同

@FishZe
Copy link
Owner Author

FishZe commented Mar 10, 2023

我这边试一下...

@XiaoMiku01
Copy link
Contributor

不是库的原因,原因找到了,是解包时候死循环了

@XiaoMiku01
Copy link
Contributor

handler.go 150L 改成这个试试

case CmdBrotliProto:
			msgBody = msgHandler.CmdBrotliProtoDecoder(&wsHeader, msg)
			msgHandler.MsgHandler(msgBody)
			//cmdHeader = WsHeaderDecoder(msgBody)
			//msgHandler.CmdHandler(&cmdHeader, msgBody[:int(cmdHeader.PackageLen)])
			//msgBody = msgBody[cmdHeader.PackageLen:]
			//
			//cmdHeader = WsHeaderDecoder(msgBody)

		default:
			msgHandler.CmdHandler(&cmdHeader, msgBody[:int(cmdHeader.PackageLen)])
		}

@FishZe
Copy link
Owner Author

FishZe commented Mar 10, 2023

client/handler的这里吗?

    case CmdBrotliProto:
	msgBody = msgHandler.CmdBrotliProtoDecoder(&wsHeader, msg)
	cmdHeader = WsHeaderDecoder(msgBody)
	for {
		msgHandler.CmdHandler(&cmdHeader, msgBody[:int(cmdHeader.PackageLen)])
		msgBody = msgBody[cmdHeader.PackageLen:]
		if len(msgBody) == 0 {
			break
		}
		cmdHeader = WsHeaderDecoder(msgBody)
	}

@FishZe
Copy link
Owner Author

FishZe commented Mar 10, 2023

我测试一下

@FishZe FishZe closed this Mar 10, 2023
@FishZe
Copy link
Owner Author

FishZe commented Mar 10, 2023

确实是这里,不会break

@FishZe
Copy link
Owner Author

FishZe commented Mar 10, 2023

不对,不是这里
我这里测试出现死循环的原因是,example代码中,在全部连接后才会启动处理器,所以造成了通道的阻塞,只有第一个命令可以发送进去
您可以测试一下把h.Run()移动到h.AddRoom前面,改成go h.Run(),我这里就没有这个问题了

@XiaoMiku01
Copy link
Contributor

似乎解决了,go h.Run() 给忘了

你看看 handler.go 能否改成这样,用递归
image

@FishZe
Copy link
Owner Author

FishZe commented Mar 10, 2023

可以的
但是递归会不会造成额外的cpu负担呢?毕竟这块峰值每秒调用上千次的...

@XiaoMiku01
Copy link
Contributor

差不多吧,递归更好看点

@XiaoMiku01
Copy link
Contributor

递归和 while True 循环都有可能消耗大量的 CPU 时间,具体取决于它们的实现方式和使用场景。

递归是一种函数调用自身的方式。如果递归不正确地实现,可能导致无限递归调用,从而消耗大量 CPU 时间,并导致堆栈溢出等问题。因此,在使用递归时,需要谨慎考虑其终止条件,确保递归调用次数有限,不会出现无限循环的情况。

while True 循环是一种无限循环,它会一直执行直到遇到退出循环的条件。如果循环体中没有合适的退出条件,也会导致无限循环,消耗大量 CPU 时间。

在大多数情况下,while True 循环更容易出现 CPU 消耗过高的问题,因为它会一直执行直到遇到退出条件,而递归则会在达到终止条件后结束。但是,如果递归实现得不好,也可能会消耗大量 CPU 时间。

因此,无论是递归还是 while True 循环,都需要谨慎设计和使用,以避免出现性能问题。

chatGPT 回答

@FishZe
Copy link
Owner Author

FishZe commented Mar 10, 2023

好的,那提一个pr吧

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants