[英]Socket ends up in CLOSE_WAIT when using Jython
使用Jython时遇到一些问题。 我实现了一个Web服务,您可以在其中上传python脚本,然后使用它们从新闻提要等获取数据。
问题是我的服务器正在泄漏文件描述符。 套接字以CLOSE_WAIT结尾,然后再也不会收集垃圾。 在关闭新闻提要之前,它通常运行良好,然后服务器很快会遇到“打开的文件太多”的情况。
在我的实现中,我使用org.python.util.PythonInterpreter,但是我也已经能够通过jyhton CLI复制它。 (对于2.5.3和2.7b2版本,都会发生相同的问题)。
我已经从以下URL下载了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()
为了使套接字从close_wait中退出,您需要关闭套接字fd。
您是正确的,如下所示的序列不会在c-python中累积fd,但会在jython中累积开放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()
这意味着远程方已将fin发送到TCP连接,但是应用程序尚未通过关闭套接字来对其进行响应。
回答我自己的问题。 该问题由jython开发团队解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.