2

我想为我的网络课程编写一个程序,我有一个套接字来监听接收数据,如果它监听并且没有接收到数据我应该终止程序,我使用 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 的函数中的套接字,当经过 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 秒后设置 global var end_call 但它不起作用,因为它永远不会回来接收函数

对我来说非常有趣的一些事情是如果定义 data_end 像:

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

嗨将在输出中打印:O

4

3 回答 3

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'
于 2013-05-18T09:46:26.643 回答
0

要回答您的第二个问题,请使用try, except

这是每个的预期行为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
于 2013-05-17T15:42:57.117 回答
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() :)

于 2013-05-17T15:23:39.300 回答