2012-03-02 31 views
2

我有此代碼(hello.py):如何釋放端口,然後再次運行Tornado應用程序?

import os,sys 
import tornado.ioloop 
import tornado.web 
import tornado.httpserver 

#http server class 
class http_server(tornado.web.RequestHandler): 
    def get(self): 
    self.write("Hello, getter!") 
    def post(self): 
    self.write("Hello, poster!") 

#create http server 
Handlers  = [(r"/",http_server)] 
App_Settings = {"debug":True} 
HTTP_Server = tornado.web.Application(Handlers,**App_Settings) 

#run http server 
HTTP_Server.listen(9999) 
tornado.ioloop.IOLoop.instance().start() 

它運行細首次使用該命令從終端
蟒hello.py

在此之後,終端不斷等待龍捲風的輸出。當我打開http://localhost:9999時,它返回「Hello,getter!」如通緝。但第二次,Python的顯示錯誤:

Traceback (most recent call last): 
    File "hello.py", line 19, in <module> 
    HTTP_Server.listen(9999) 
    File "/usr/local/.../tornado/web.py", line 1227, in listen 
    server.listen(port, address) 
    File "/usr/local/.../tornado/netutil.py", line 100, in listen 
    sockets = bind_sockets(port, address=address) 
    File "/usr/local/.../tornado/netutil.py", line 265, in bind_sockets 
    sock.bind(sockaddr) 
    File "<string>", line 1, in bind 
socket.error: [Errno 98] Address already in use 

我按下Ctrl-Z派「hello.py」背景,但這並不能釋放的端口。如果我關閉終端,端口被釋放。然而,python源文件的路徑深深嵌套在目錄中,所以我不想關閉終端並在代碼中的每一次更改後重新啓動它。有些人建議我應該在應用程序設置中使用debug = True,但這似乎與Tornado持續保持端口的事情無關。

我也嘗試過「pidof python」,然後殺死所有的python進程,但端口仍然被固執的Tornado持有。有什麼方法可以用Python語句釋放Tornado持有的所有端口?或手動?

+1

最簡單的方法; CRTL-C不工作而不是CTRL-Z?如果你有一個有歷史的shell,那麼不應該再引發太多的問題。 – 2012-03-02 07:25:25

+0

似乎要做的訣竅:) – jondinham 2012-03-02 07:28:37

+0

我不知道答案只是「Ctrl-C」,哈哈,tks約阿希姆,請添加到答案:) – jondinham 2012-03-02 07:29:44

回答

3

如果您可以使用Python語句發佈Tornado端口,那麼您的問題並非真正的答案,但由於它似乎解決了您的問題,所以我想我會寫一個簡短的答案;

Ctrl-Z只會讓你的程序進入睡眠狀態,但不會釋放任何端口

如果您另一方面使用Ctrl-C,程序將被完全停止。這將允許您只使用shell歷史記錄再次啓動它。

1

請記住,您也可能在TIME_WAIT status中發生,從而阻止您在釋放套接字後立即使用套接字。

相關問題