python简单线程不会在没有做任何事情的情况下结束(也许)

时间:2017-03-09 16:59:13

标签: python multithreading

当我运行以下代码(使用“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()


我错过了什么或做错了什么?

1 个答案:

答案 0 :(得分:0)

首先,您有与使用混合制表符和空格进行缩进相关的缩进问题。虽然他们没有导致您的代码在这种特殊情况下行为不端,但如果您不坚持使用其中一种,那么 会导致您出现问题。他们已经破坏了你问题中显示的缩进词;请参阅print "test"中的main行,该行看起来未对齐。

其次,您应该使用threading而不是低级thread模块。您的问题正在发生,因为正如thread module documentation中所述,

  

当主线程退出时,系统定义其他线程是否存活。在使用本机线程实现的SGI IRIX上,它们存活下来。在大多数其他系统上,它们被杀死而不执行try ... finally子句或执行对象析构函数。

threading个线程允许您明确定义其他线程是否应该在主线程死亡后继续存在,并且默认为幸存。通常,threading更容易正确使用。