使用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()
答案 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开发团队解决。