Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当使用Jython时,套接字以CLOSE_WAIT结束_Java_Python_Sockets_Jython - Fatal编程技术网

Java 当使用Jython时,套接字以CLOSE_WAIT结束

Java 当使用Jython时,套接字以CLOSE_WAIT结束,java,python,sockets,jython,Java,Python,Sockets,Jython,我在使用Jython时遇到了一些问题。 我已经实现了一个web服务,您可以上传python脚本,然后使用它们从新闻提要获取数据,等等 问题是我的服务器正在泄漏文件描述符。套接字以CLOSE_WAIT结束,然后再也不会收集垃圾。 它通常工作正常,直到新闻提要关闭,然后服务器很快就会遇到“太多打开的文件” 在我的实现中,我使用org.python.util.PythonInterpreter,但我也能够通过jyhton CLI复制它。 版本2.5.3和2.7b2都会出现相同的问题 我已经从下面的UR

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

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

在我的实现中,我使用org.python.util.PythonInterpreter,但我也能够通过jyhton CLI复制它。 版本2.5.3和2.7b2都会出现相同的问题

我已经从下面的URL下载了Jython。

如果您在一个shell中运行jython CLI,然后查看另一个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')
要检查插座,请执行以下操作:

 $ netstat -ant|grep CLOSE
如果有人能帮我找到解决办法,我将不胜感激

我不是问“等待”意味着什么,而是问如何解决问题

我怎样才能拿到插座的把手,这样我就可以把它关上

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

要使套接字脱离关闭状态,请等待,您需要关闭套接字fd

下面这样的序列在c-python中不累积fd,但在jython中累积open fd,这是正确的。我认为这与jython垃圾收集器的工作方式有关。在jython difference文档中,有一个注意事项是,像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开发团队解决


你能给出一个与jython一起工作的例子吗?修改为包括一个例子如果服务器回答“404未找到”,那么你的例子仍然泄漏关闭等待。试试“www.google.com/notfound”。