如何强制使用python打开套接字关闭?

时间:2012-11-08 11:13:54

标签: python sockets apache-kafka

我目前正在使用此lib来测试我已设置的kafka服务器:https://github.com/dsully/pykafka

import kafka
import time

def test_kafka_server(n=1):
    for i in range(0,n):
        producer = kafka.producer.Producer('test',host='10.137.8.192')
        message = kafka.message.Message(str(time.time()))
        producer.send(message)
        producer.disconnect()

def main():
    test_kafka_server(100000)

if __name__ == '__main__':
    main()

最终发生的事情是我最终超载了我自己的本地机器。

我得到错误10055 ,根据谷歌意味着“Windows已经用完了TCP / IP套接字缓冲区,因为一次打开的连接太多了。”依据对于netstat,producer.disconnect()没有关闭套接字,而是将其置于TIME_WAIT状态。

ipython调试器指向这一行:

C:\Python27\lib\socket.pyc in meth(name, self, *args)
    222     proto = property(lambda self: self._sock.proto, doc="the socket protocol")
    223 
--> 224 def meth(name,self,*args):
    225     return getattr(self._sock,name)(*args)
    226 

作为罪魁祸首,但这似乎陷入了低于我感到满意的事情。

我搜索过并找到了Python socket doesn't close connection properly,建议这样做:

setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

所以,我在io.py文件中使用该选项重建了pykafka lib:

  def connect(self):
    """ Connect to the Kafka server. """
    global socket
    self.socket = socket.socket()
    self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.socket.connect((self.host, self.port))

我仍然得到同样的错误。

我没有把setsockopt线放在正确的位置吗?还有什么我可以尝试的吗?

1 个答案:

答案 0 :(得分:6)

您所描述的是套接字级别的正常TCP行为。当用户级程序关闭套接字时,内核不会立即释放套接字。它进入TIME_WAIT状态:

  

TIME-WAIT(服务器或客户端)表示等待足够   时间过去以确保远程TCP收到确认   其连接终止请求。 [根据RFC 793的一个连接   可以在TIME-WAIT中停留最多四分钟,称为MSL   (最大段寿命)。

所以套接字已关闭。 socket.SO_REUSEADDR用于侦听器(服务器),不影响客户端连接。好吧,在绑定套接字时真的用过。