当我运行以下代码(使用“sudo python servers.py”)时,过程似乎只是立即完成打印“test”。
为什么函数“proxy_server”不会运行?或许他们这样做,但我没有意识到这一点。 (因为代理功能的第一行不打印任何东西)
这是一个无能为力的代码,我不想放不必要的内容,但它仍然表明我的问题:
import os,sys,thread,socket,select,struct,time
HTTP_PORT = 80
FTP_PORT=21
FTP_DATA_PORT = 20
IP_IN = '10.0.1.3'
IP_OUT = '10.0.3.3'
sys_http = 'http_proxy'
sys_ftp = 'ftp_proxy'
sys_ftp_data = 'ftp_data_proxy'
def main():
try:
thread.start_new_thread(proxy_server, (HTTP_PORT, IP_IN,sys_http,http_handler))
thread.start_new_thread(proxy_server, (FTP_PORT, IP_IN,sys_ftp,http_handler))
thread.start_new_thread(proxy_server, (FTP_DATA_PORT, IP_OUT,sys_ftp_data,http_handler))
print "test"
except e:
print 'Error!'
sys.exit(1)
def proxy_server(host,port,fileName,handler):
print "Proxy Server Running on ",host,":",port
def http_handler(src,sock):
return ''
if __name__ == '__main__':
main()
我错过了什么或做错了什么?
答案 0 :(得分:0)
首先,您有与使用混合制表符和空格进行缩进相关的缩进问题。虽然他们没有导致您的代码在这种特殊情况下行为不端,但如果您不坚持使用其中一种,那么 会导致您出现问题。他们已经破坏了你问题中显示的缩进词;请参阅print "test"
中的main
行,该行看起来未对齐。
其次,您应该使用threading
而不是低级thread
模块。您的问题正在发生,因为正如thread
module documentation中所述,
当主线程退出时,系统定义其他线程是否存活。在使用本机线程实现的SGI IRIX上,它们存活下来。在大多数其他系统上,它们被杀死而不执行try ... finally子句或执行对象析构函数。
threading
个线程允许您明确定义其他线程是否应该在主线程死亡后继续存在,并且默认为幸存。通常,threading
更容易正确使用。