繁体   English   中英

使用Jython时,套接字以CLOSE_WAIT结尾

[英]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开发团队解决。

http://bugs.jython.org/issue2170

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM