
1 cheng007 2015 年 3 月 21 日 bSendData = False def check(fd): while True: gevent.sleep(30) #check socket if bSendData: bSendData = false else: # close socket fd fd.close() def recv(fd): while True: data = fd.recv(100) if len(data) <= 0: return else: bSendData = True gevent.spawn(recv, fd) gevent.spawn(check,fd) 你可以为每条连接创建一个协程定时检查,这段时间客户端没有发数据。 大致如此,就是消耗有点大,需要多创建一个协程了 |
2 cheng007 2015 年 3 月 21 日 代码没办法格式化,你凑合看看就好 |
3 155 2015 年 3 月 21 日 recv数据和心跳包套在with gevent.Timeout里. |
5 fordoo 2015 年 3 月 21 日 也可以试试socket里面的keep-alive选项。 http://stackoverflow.com/questions/12248132/how-to-change-tcp-keepalive-timer-using-python-script |
7 yueyoum 2015 年 3 月 22 日 erlang 大法好 |
8 cloudzhou 2015 年 3 月 23 日 @yueyoum 这种模型和语言无关的,和设计有关。 @fordoo keep-alive选项是很好的选择,但是keep-alive是协议里面支持的,为的是保证链接可用,而不是问题里面提到的:长久不发信息,就断掉链接。 比较环保的一种做法是: 维护一个 lru cache, connection 就是 key。 当每个链接接受到新的数据之后,更新 connection 当前时间,lru 更新。 当 lur 超过一定长度,从某个时间段之后,强制断掉之后的 connection。 可以使用 redis 来做这件事情,File descriptor 作为 key, 但是需要保持 File descriptor -> connection 的映射。 |
9 yueyoum 2015 年 3 月 23 日 |
10 cheng007 2015 年 3 月 23 日 @x14oL 我对gevent的api不够熟悉,@155的写法是正确的。 你可以去了解一下libevent, 还有node.js的底层库libuv,gevent并不是真正的并发,他只是利用greenlet协程封装了异步过程。 |
13 sbmzhcn OP 感谢回复,我用的python写的一个比较简单的程序。我是希望在python代码上作一个修改就可以搞定的。 @cloudzhou 这个做法应该是可以尝试的。 |