我目前正在使用此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线放在正确的位置吗?还有什么我可以尝试的吗?
答案 0 :(得分:6)
您所描述的是套接字级别的正常TCP行为。当用户级程序关闭套接字时,内核不会立即释放套接字。它进入TIME_WAIT状态:
TIME-WAIT(服务器或客户端)表示等待足够 时间过去以确保远程TCP收到确认 其连接终止请求。 [根据RFC 793的一个连接 可以在TIME-WAIT中停留最多四分钟,称为MSL (最大段寿命)。
所以套接字已关闭。 socket.SO_REUSEADDR用于侦听器(服务器),不影响客户端连接。好吧,在绑定套接字时真的用过。