当使用Jython时,Socket最终会在CLOSE\u WAIT中结束

2024-05-19 01:38:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

问题是我的服务器正在泄漏文件描述符。套接字在CLOSE_WAIT中结束,然后再也不会得到垃圾回收。 它通常工作得很好,直到一个新闻源关闭,然后服务器很快就会遇到“太多打开的文件”。在

在我的实现中,我使用org.python.util.PythonInterpreter,但我也可以通过jyton 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中运行jythoncli,然后在另一个shell中查看套接字状态,您可以看到它们最终以CLOSE_WAIT forever结束。在

复制:

 $ 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')

检查插座:

^{pr2}$

如果有人能帮我找到解决办法,我将不胜感激。在

询问“关闭等待”意味着什么,而是如何解决问题。在

我怎样才能拿到插座的把手,这样我才能把它关上呢。在

Jython2.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()

Tags: 文件org服务器comhttpwwwutilgoogle
3条回答

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

要使套接字退出close_wait,您需要关闭socket fd。在

下面这样的序列在c-python中并没有累积fd,而是在jython中累积了openfd,这是正确的。我认为这和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语法)

^{pr2}$

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

http://bugs.jython.org/issue2170

相关问题 更多 >

    热门问题