停止python程序

时间:2013-05-17 15:17:20

标签: python python-2.7

我想为我的网络课程编写一个程序,我有一个侦听接收数据的套接字,如果它监听并且没有接收数据我应该终止程序,我使用threading.Timer来像定时器一样行,并且像t = threading.Timer(5, end_data)在我的函数中监听接收数据,但我无法终止end_data中的程序:

def end_data():
    sys.exit()

任何人都可以帮助我吗? 我也测试下面的代码芽没有终止在终端运行程序:(

def end_data():
    try:
        sys.exit()
    except:
        print"exception"

我希望当终端打印Tinas-MacBook-Pro时:~tina $

我正在收听名为receive not main的函数中的socket,当没有数据接收时经过5秒将运行end_data并且似乎永远不会返回接收函数,该函数的一部分如下所示

def receive():
   s2 = socket(AF_INET, SOCK_DGRAM)
   s2.bind(addr3_2) 
   global end_call
   global base_window
   write=open('pictur.jpg','wb')
   s = socket(AF_INET, SOCK_DGRAM) 
   s.bind(addr3)
   while(end_call==0):
      t = threading.Timer(5, end_data)
      t.start()       
      recv_data, addr = s.recvfrom(3500)#size ro hala badan check kon
      t.cancel()

首先我决定在5秒后设置全局var end_call,但它不起作用,因为它永远不会回来接收函数

对我来说非常有趣的一件事就是定义data_end,如:

def end_data():
    os._exit
    print "Hi"

您将在输出中打印:O

3 个答案:

答案 0 :(得分:0)

也许尝试像这样的设置

run_program = True

def end_data() :
    global run_program
    run_program = False

t = threading.Timer(5, end_data)
t.start()

while run_program:
    #do stuff
    time.sleep(1)

t.join() #maybe not needed

确保你调用了t.start():)

答案 1 :(得分:0)

使用tryexcept回答您的第二个问题。

这是pydoc的预期行为:

"Since exit() ultimately “only” raises an exception, it will only exit 
the process when called from the main thread, and the exception is not intercepted."

示例:

def end_data():
    try:
        sys.exit("error!")
    except SystemExit, e: 
        print "Exception caught: ", e.args


print "begin"
end_data()
print "end"

输出:

$ ./test.py
begin
Exception caught:  ('error!',)
end

答案 2 :(得分:0)

使用线程事件怎么样?

import threading

event = threading.Event()

def signal_stop():
    try:
        # do what you have to do
    finally:
        event.set()


t = threading.Timer(5, signal_stop)

print 'start thread and wait for it'
t.start()
event.wait()
print 'done'