我在使用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()
这意味着远程方已将fin发送到TCP连接,但应用程序尚未通过关闭套接字来响应它。在
要使套接字退出close_wait,您需要关闭socket fd。在
下面这样的序列在c-python中并没有累积fd,而是在jython中累积了openfd,这是正确的。我认为这和jython垃圾收集器的工作方式有关。在jython差异文档中有一个注释,像open().read()这样的操作会导致问题——我怀疑这是同一个潜在问题。在
解决方法是正确处理错误情况,如下所示(2.5语法)
^{pr2}$回答我自己的问题。 这个问题由jython开发团队解决。在
http://bugs.jython.org/issue2170
相关问题 更多 >
编程相关推荐