Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中安全退出多线程套接字服务器?_Python_Multithreading_Sockets - Fatal编程技术网

如何在python中安全退出多线程套接字服务器?

如何在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

为了好玩,我刚刚写了一个非常简单的udp聊天程序。它按预期工作,但现在我不知道如何安全地退出它。由于以下问题,调用sys.exit()似乎是不可接受的:

简单地通过ctrl+c来提升信号将失败,因为它将被raw_input()截获

有什么像样的方法来处理吗

以下是我的代码片段:

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
功能进行一点更改

您尝试过吗?您尝试过吗?