如何在python中安全退出多线程套接字服务器?
为了好玩,我刚刚写了一个非常简单的udp聊天程序。它按预期工作,但现在我不知道如何安全地退出它。由于以下问题,调用sys.exit()似乎是不可接受的: 简单地通过ctrl+c来提升信号将失败,因为它将被raw_input()截获 有什么像样的方法来处理吗 以下是我的代码片段:如何在python中安全退出多线程套接字服务器?,python,multithreading,sockets,Python,Multithreading,Sockets,为了好玩,我刚刚写了一个非常简单的udp聊天程序。它按预期工作,但现在我不知道如何安全地退出它。由于以下问题,调用sys.exit()似乎是不可接受的: 简单地通过ctrl+c来提升信号将失败,因为它将被raw_input()截获 有什么像样的方法来处理吗 以下是我的代码片段: import socket import threading s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) address = ('192.168.1.x
import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
address = ('192.168.1.xxx', 31500)
target_address = ('192.168.1.xxx', 31500)
s.bind(address)
print('waiting for input...')
def rcv():
while True:
data, addr = s.recvfrom(2048)
if not data:
continue
print 'Received: #### ', data
print '\n'
def send():
while True:
msg = raw_input()
if not msg:
continue
s.sendto(msg, target_address)
t1 = threading.Thread(target = rcv)
t2 = threading.Thread(target = send)
t1.start()
t2.start()
取代我先前的答案: 我将您的代码修改为:
import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
address = ('192.168.1.xxx', 31500)
target_address = ('192.168.1.xxx', 31500)
s.bind(address)
EXIT_MSG_GUARD = "@Quit!"
print('waiting for input...')
def rcv():
while True:
data, addr = s.recvfrom(2048)
if not data:
continue
print 'Received: #### ', data
print '\n'
def send():
while True:
msg = raw_input()
if not msg:
continue
else:
s.sendto(msg, target_address)
if msg == EXIT_MSG_GUARD:
return
t1 = threading.Thread(target = rcv)
t2 = threading.Thread(target = send)
t1.setDaemon(True)
t1.start()
t2.start()
我做了两件事:
- 添加消息保护(在我的示例中,
,但您可以将其更改为任何您喜欢的内容):当用户输入该文本时,在发送该文本后,@Quit!
线程结束t2
- 使线程
,这意味着当主线程和所有非守护进程线程结束时,也将结束,程序将退出t1
作为守护进程线程的替代方案,您可以使用发布的解决方案(也要注意限制!)。它更好(建议使用),但需要做更多的工作,包括对您的
rcv
功能进行一些更改,以替换我以前的答案:
我将您的代码修改为:
import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
address = ('192.168.1.xxx', 31500)
target_address = ('192.168.1.xxx', 31500)
s.bind(address)
EXIT_MSG_GUARD = "@Quit!"
print('waiting for input...')
def rcv():
while True:
data, addr = s.recvfrom(2048)
if not data:
continue
print 'Received: #### ', data
print '\n'
def send():
while True:
msg = raw_input()
if not msg:
continue
else:
s.sendto(msg, target_address)
if msg == EXIT_MSG_GUARD:
return
t1 = threading.Thread(target = rcv)
t2 = threading.Thread(target = send)
t1.setDaemon(True)
t1.start()
t2.start()
我做了两件事:
- 添加消息保护(在我的示例中,
,但您可以将其更改为任何您喜欢的内容):当用户输入该文本时,在发送该文本后,@Quit!
线程结束t2
- 使线程
,这意味着当主线程和所有非守护进程线程结束时,也将结束,程序将退出t1
作为守护进程线程的替代方案,您可以使用发布的解决方案(也要注意限制!)。它更好(建议使用),但需要做更多的工作,包括对
rcv
功能进行一点更改您尝试过吗?您尝试过吗?