我想为我的网络课程编写一个程序,我有一个侦听接收数据的套接字,如果它监听并且没有接收数据我应该终止程序,我使用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
答案 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)
使用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
答案 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'