游戏服务器中多线程之间如何通信
在游戏处事器中,线程的打点是重中之重,由于线程数目不能太多,所觉得了进步游戏处事器并发性,就必要在线程处理赏罚营业的速率要快,不能长时刻卡住线程,好比,不能有收集io,磁盘IO等耗时的操纵。以是我们会把有限的线程数进配按需分派。线程的首要分派方法如下: 1,与客户端的IO线程 认真吸取客户端动静,和向客户端发送动静。 2,处理赏罚玩家营业的逻辑线程 认真营业逻辑的处理赏罚与计较。 3,处理赏罚rpc或数据库同步的收集线程。 认真差异处事之间的通讯 4,处理赏罚日记的磁盘IO 线程 响应的线程别离做本身该做的时刻。可是这时辰题目来了,既然按用途分派了这些线程,那不行免费的就会呈现差异线程之间的数据交互了。举个例子来说,好比玩家登岸和列队,若是说一个区一台物理机,处理赏罚与客户端的IO线程占1个,营业逻辑线程16个,哀求数据库的线程3个。其余的先忽略不算。这个时辰,处事器收到客户端登岸的哀求,营业线程收到这个哀求,,第一件工作是去数据库查用户的信息,由于营业逻辑线程是多个用户之间共用的,以是你不能在这里守候数据库哀求的返回,要否则会卡此外营业逻辑处理赏罚。最好的做法就是,把这个哀求封装成一个变乱,发送到数据库同步线程中行止理赏罚这个事。守候数据库线程处理赏罚完了,再把功效汇报营业逻辑线程,然后再处理赏罚营业,这个时辰处理赏罚的数据都在内存中了,以是速率很是快,处理赏罚完之后再返回客户端。 有人说,那这样还不是卡登岸吗?是的,必卡登岸,由于处理赏罚数据库的线程就那么3个。对付mysql的查询机能测试如下: 我们3个线程按1500个计较,那么也只有登岸并发到达1500的时辰,才会认为处事慢一些,(现实环境也许会再底一些),假如并发能到达这么高,声名游戏很火了,可以守候数钱了。假如再多的人,我们就可以行使列队的成果的。可以查询到数据库线程中正在守候执利用命的数目,假如到达某个值,就可以在营业处事中给客户端返回正在列队的,让客户端过一会再来哀求即可。 回到正题,那么游戏处事器线程之间该怎样转达数据呢,也许每小我私人的做法纷歧样,这里只罗列中一个,但愿给各人给带来些参考,就当是交换进修了。假如你有更好的要领,也但愿您评述分享。 在Java中,多线程之间交互数据,即A线程给B线程一个哀求变乱,A线程还要获取B线程的执行功效,好比登岸,请数据库线程去查库,查完之后汇报逻辑线程。Java提供了一个Future/Callable的机制,具体各人可以自动百度它们的用法,可是它们有一个弱点,就是A线程在获取功效时(挪用future.get())的时辰是同步的,假如B线程没有执行完,照旧会卡A线程。这表现不是我们想要的。对付这一点,我们巨大的异步框架,netty的作者给出了一个办理要领,那就是Future / promise模式。这里对它的源码暂不做分皙了,偶然刻另写文章声名吧,有乐趣的同窗可以本身查察。这里只说一下它的用法。 此代码只是模仿,真实应用中还必要本身计划,起首是数据库查询的打点类: 然后是营业打点类: 通过这个例子,其余关于多线程交互数据的成果实现,各人就可以举一返回三了。 【编辑保举】
点赞 0 (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |