1
cheng007 2015-03-21 11:09:42 +08:00 1
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-03-21 11:10:28 +08:00
代码没办法格式化,你凑合看看就好
|
3
155 2015-03-21 11:23:00 +08:00
recv数据和心跳包套在with gevent.Timeout里.
|
5
fordoo 2015-03-21 21:07:12 +08:00
也可以试试socket里面的keep-alive选项。 http://stackoverflow.com/questions/12248132/how-to-change-tcp-keepalive-timer-using-python-script
|
7
yueyoum 2015-03-22 17:37:15 +08:00
erlang 大法好
|
8
cloudzhou 2015-03-23 11:42:36 +08:00
@yueyoum 这种模型和语言无关的,和设计有关。
@fordoo keep-alive选项是很好的选择,但是keep-alive是协议里面支持的,为的是保证链接可用,而不是问题里面提到的:长久不发信息,就断掉链接。 比较环保的一种做法是: 维护一个 lru cache, connection 就是 key。 当每个链接接受到新的数据之后,更新 connection 当前时间,lru 更新。 当 lur 超过一定长度,从某个时间段之后,强制断掉之后的 connection。 可以使用 redis 来做这件事情,File descriptor 作为 key, 但是需要保持 File descriptor -> connection 的映射。 |
9
yueyoum 2015-03-23 13:47:10 +08:00
|
10
cheng007 2015-03-23 15:32:54 +08:00 1
@x14oL 我对gevent的api不够熟悉,@155的写法是正确的。
你可以去了解一下libevent, 还有node.js的底层库libuv,gevent并不是真正的并发,他只是利用greenlet协程封装了异步过程。 |
13
sbmzhcn OP 感谢回复,我用的python写的一个比较简单的程序。我是希望在python代码上作一个修改就可以搞定的。
@cloudzhou 这个做法应该是可以尝试的。 |