使用Jython时,套接字在CLOSE_WAIT中结束

时间:2014-06-21 08:50:09

标签: java python sockets jython

使用Jython时遇到了一些问题。 我已经实现了一个Web服务,您可以在其中上传python脚本,然后使用它们从新闻源等获取数据。

问题是我的服务器正在泄漏文件描述符。套接字最终在CLOSE_WAIT中,然后永远不会被垃圾收集。 它通常很有效,直到新闻Feed停止,然后服务器很快就会遇到太多打开的文件'

在我的实现中,我使用org.python.util.PythonInterpreter,但我也能够通过jyhton CLI重现它。 (版本2.5.3和2.7b2都会出现同样的问题。)

我已从以下网址下载了Jython。 http://search.maven.org/remotecontent?filepath=org/python/jython-standalone/2.5.3/jython-standalone-2.5.3.jar

如果你在一个shell中运行jython CLI然后查看另一个shell中的套接字状态,你会发现它们最终会在CLOSE_WAIT中结束。

重现:

 $ java -cp jython-standalone-2.5.3.jar org.python.util.jython
 >>> import urllib2
 >>> urllib2.urlopen('http://www.google.com/notfound')
 >>> urllib2.urlopen('http://www.google.com/notfound')
 >>> urllib2.urlopen('http://www.google.com/notfound')
 >>> urllib2.urlopen('http://www.google.com/notfound')
 >>> urllib2.urlopen('http://www.google.com/notfound')

检查套接字:

 $ netstat -ant|grep CLOSE

如果有人能帮助我找到解决方案,我将不胜感激。

询问CLOSE_WAIT的含义,但是如何解决问题。

如何获得套接字的句柄,以便我可以关闭它。

与jython版本2.7b2有同样的问题。

 $ java -cp jython-standalone-2.7-b1.jar org.python.util.jython
 >>> import contextlib, urllib2
 >>> u = 'http://www.google.com/notfound'
 >>> with contextlib.closing(urllib2.urlopen(u)) as x:
 >>>      print x.read()

3 个答案:

答案 0 :(得分:0)

要使套接字从close_wait中退出,您需要关闭套接字fd。

你是正确的,下面的序列不会在c-python中累积fd,但会在jython中累积open fd。我认为这与jython垃圾收集器的工作方式有关。在jython差异文档中有一个注释,像open()。read()这样的行为会导致问题 - 我怀疑它是相同的潜在问题。

>>> urllib2.urlopen('http://www.google.com/').close()
>>> urllib2.urlopen('http://www.google.com/').close()
>>> urllib2.urlopen('http://www.google.com/').close()
>>> urllib2.urlopen('http://www.google.com/').close()
>>> urllib2.urlopen('http://www.google.com/').close()
>>> urllib2.urlopen('http://www.google.com/').close()

解决方案是正确处理错误条件,如下所示(2.5语法);

try: 
  urllib2.urlopen('http://www.google.com/not-found')
except urllib2.HTTPError, e:
  e.fp.close()

答案 1 :(得分:0)

这意味着远程方已将fin发送到TCP连接,但应用程序尚未通过关闭套接字来响应它。

答案 2 :(得分:0)

回答我自己的问题。 问题由jython开发团队解决。

http://bugs.jython.org/issue2170