【问题标题】:How do I close all sockets opened by Tornado?如何关闭 Tornado 打开的所有套接字?
【发布时间】:2017-12-24 01:27:28
【问题描述】:

Tornado 有一个打开的套接字,我似乎无法将其关闭。

自从我一周前上次运行此服务器以来,我打开和关闭了我的计算机,并且终端没有运行,我真的很惊讶。总而言之,我认为这台服务器在过去一周内关闭了。

到目前为止,我尝试过的方法是解决类似问题的方法:python websocket with tornado. Socket aren't closed,但什么也没做。

我尝试过使用IOLoop.close(all_fds=True) PyDoc for this function,返回如下错误。

>>>tornado.ioloop.IOLoop.close(all_fds=True)

Traceback(最近一次调用最后一次):

文件“”,第 1 行,在

TypeError: unbound 方法 close() 必须以 IOLoop 实例作为第一个参数调用(什么都没有)

如何关闭所有套接字,以便重新开始?

【问题讨论】:

    标签: python sockets tornado


    【解决方案1】:

    有趣。

    首先,你应该为tornado.ioloop.IOLoopobject调用close()方法,而不是class object。您可以使用方法tornado.ioloop.IOLoop.current() 获取当前的tornado.ioloop.IOLoop 对象。

    例子:

    my_ioloop = tornado.ioloop.IOLoop.current()
    my_ioloop.close(all_fds=True)
    

    进一步阅读:

    【讨论】:

    • 这不起作用。我仍然收到错误消息,提示套接字保持打开状态。
    • 也许套接字不再向 tornado 注册,而只在它引用的一些更高的框架中注册?
    【解决方案2】:

    在我的例子中,问题不在于 Tornado,而在于它开始的一个过程,即使在它失去了跟踪之后仍然继续。

    当我重新启动计算机时,OSX 会跟踪该过程,但 Tornado 没有。解决方案是找到打开的端口并关闭 Tornado 正在使用的端口。

    答案最初来自这里: https://stackoverflow.com/a/17703016/4808079

    //first, check the port which your code opens.
    $ sudo lsof -i :8528
    COMMAND   PID USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME
    Python  29748 root    4u  IPv6 0xe782a7ce5603265      0t0  TCP *:8528 (LISTEN)
    Python  29748 root    5u  IPv4 0xe782a7ce4aec61d      0t0  TCP *:8528 (LISTEN)
    
    //then kill the process, using the PID
    $ sudo kill 29748
    

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 2016-02-14
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 2014-09-18
      相关资源
      最近更新 更多