当前位置: 首页 > news >正文

Skynet 小试Debug_console...

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    昨天凌晨4点还在写Skynet 服务试玩,结果发现自己写的服务出现内存泄漏了。

    今天早上起床吃早餐的时候一直在想:

    "如果每个Lua服务处理完客户端关闭的网络连接后,服务是否会自动退出呢?"

    答案:不会!

 

    现在,我们来看昨天写的Lua网络连接处理服务:

    首先是main.lua:

local skynet = require "skynet"
local socket = require "socket"



skynet.start(function()

	local id = socket.listen("192.168.2.5",80)
	
	socket.start(id , function(fd,addr)
	
		local cnn = skynet.newservice "network"
		skynet.send(cnn,"lua","SOCKET",fd)
		socket.abandon(fd)

	end)
	--skynet.exit()
end)

 

    这里没什么问题,毕竟如果你skynet在start函数内退出,你监听的套接字也将被清空。

    然后是network.lua:

local skynet = require "skynet"
local socket = require "socket"

skynet.init(function()
	print("init was success...")
end)

local CMD = { }


function CMD.SOCKET(fd)

	socket.start(fd)
	socket.write(fd,"welcome!\n\r>>")

	while fd do

		local buf = socket.readline(fd)

		if buf and buf ~= "exit()" then

			socket.write(fd,"you say: " .. buf .. "\r\n>>")

		else
			skynet.error("Client Closed this Connection...")
			socket.close(fd)
			break
		end
	end

end

skynet.start(function()
	skynet.dispatch("lua",function(_,_,cmd,fd)

		local f = assert(CMD[cmd])
		if f then
			f(fd)
		end
	end)
end)

 

    首先while语句开始,读取client 内容然后进入判断。

    然后socket阻塞连接并等待客户端数据。

    最后客户端关闭连接进入socket.close阶段,并且退出While循环。

    粗略一下没什么问题!但是细心的朋友可以看出,前面main文件在start方法内没调用skynet.exit就会一直存在。那我们怎么知道一个服务知否存在呢? 这就要靠debug_console了,我们简单修改一下main.lua文件,启动debug_console服务。

    修改后的main.lua文件如下:

local skynet = require "skynet"
local socket = require "socket"


skynet.start(function()
	skynet.newservice("debug_console",8000) -- 开启debug_console服务
	local id = socket.listen("192.168.2.5",80)
	socket.start(id,function(fd,ipaddr)
			print(fd,ipaddr)
			local cnn = skynet.newservice "network"
			print(cnn)			
			skynet.send(cnn,"lua","SOCKET",fd)
			socket.abandon(fd)
	end)

end)

    我在开始时,先启动debug_console服务并监听8000端口;然后我们使用telnet连接上去。

    164828_F10h_2420772.png

    这个"7 connected" 表示我们的console已经连接上了。

    164602_rzrh_2420772.png

    然而我们的客户端还未进行连接,所以我们先list一下后发现network服务是没有启动;

    164738_qzfw_2420772.png

    这时候,可以在cmd命令行内输入 telnet 192.168.2.5 80来发起一个客户端连接。

    165154_Gt0T_2420772.png

    好的,服务端已经进行了正确的回应。这时候我们在console 内再次进行list;

    165254_b2Hd_2420772.png

    network的lua服务已经启动并且接手管理socket连接相关处理,而我们的服务内只是简单完成了请求、回应相同数据的逻辑。

    这时候我们将client断开后再list会发现:network服务没有按照我预先想的那样自己退出。debug单步调试后也发现连接被close掉了。而此外你gc也仅仅只是进行lua代码的垃圾回收,而无法退出一个服务、

    170622_1Xkf_2420772.png

    至此,我们只能使用kill命令强行杀掉这个服务了。

    171006_X9ph_2420772.png

    我们的lua服务必须在每个连接close后主动调用skynet.exit,否则一个隐式的内存泄漏将会产生。

    如果我们在一个万人在线的游戏服务器不小心犯了这个错误,每个用户只要重复登录5次,服务器的内存将会瞬间被吃光。

转载于:https://my.oschina.net/CandyMi/blog/846290

相关文章:

  • 大数据~说说Hadoop
  • oracle获取clob调优
  • maven的setting.xml配置,解决maven下载速度过慢
  • java中的String类常量池详解
  • 从0移植uboot (二) _uboot启动流程分析
  • NHibernate 基础教程
  • MySQL for Mac 安装和基本操作
  • Java使用SQLServerBulkCopy实现数据库批量操作
  • innerHTML,innerText,outHTML,outText区别
  • Selenium2+python自动化37-爬页面源码(page_source)
  • reverse-integer
  • AC日记——传纸条 洛谷 P1006
  • mongodb 聚合操作
  • P1396 营救
  • 使用Gradle第一次构建Java程序
  • 【Leetcode】101. 对称二叉树
  • 分享的文章《人生如棋》
  • 【刷算法】从上往下打印二叉树
  • Javascript编码规范
  • Mocha测试初探
  • PHP的Ev教程三(Periodic watcher)
  • redis学习笔记(三):列表、集合、有序集合
  • Vue2.0 实现互斥
  • win10下安装mysql5.7
  • 简单易用的leetcode开发测试工具(npm)
  • 译自由幺半群
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​iOS实时查看App运行日志
  • ​Java并发新构件之Exchanger
  • (175)FPGA门控时钟技术
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (笔试题)分解质因式
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (接口封装)
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原)Matlab的svmtrain和svmclassify
  • (转)Scala的“=”符号简介
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .a文件和.so文件
  • .Net - 类的介绍
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net MVC + EF搭建学生管理系统
  • .net Signalr 使用笔记
  • .Net Web项目创建比较不错的参考文章
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net解析传过来的xml_DOM4J解析XML文件