gpt4 book ai didi

Python 套接字接受 block - 防止应用程序退出

转载 作者:太空狗 更新时间:2023-10-29 20:48:35 25 4
gpt4 key购买 nike

我写了一个非常简单的 python 类,它等待套接字上的连接。目的是将此类粘贴到现有应用程序中,并以异步方式将数据发送到连接的客户端。

问题是在等待 socket.accept() 时,我无法通过按 ctrl-c 来结束我的应用程序。我也无法检测到我的类(class)何时超出范围并通知它结束。

理想情况下,下面的应用程序应该在 time.sleep(4) 到期后退出。正如您在下面看到的,我尝试使用 select,但这也会阻止应用程序响应 ctrl-c。如果我可以检测到变量“a”超出了 main 方法的范围,我可以设置退出标志(并减少选择超时以使其响应)。

有什么想法吗?

谢谢


import sys
import socket
import threading
import time
import select

class Server( threading.Thread ):
def __init__( self, i_port ):
threading.Thread.__init__( self )
self.quitting = False
self.serversocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
self.serversocket.bind( (socket.gethostname(), i_port ) )
self.serversocket.listen(5)
self.start()

def run( self ):
# Wait for connection
while not self.quitting:
rr,rw,err = select.select( [self.serversocket],[],[], 20 )
if rr:
(clientsocket, address) = self.serversocket.accept()
clientsocket.close()

def main():
a = Server( 6543 )
time.sleep(4)

if __name__=='__main__':
main()

最佳答案

self.start() 之前的 __init__ 添加 self.setDaemon(True)

(在 Python 2.6 及更高版本中,首选 self.daemon = True)。

关键思想解释here :

The entire Python program exits when no alive non-daemon threads are left.

因此,您需要为那些不应该让整个进程仅通过自身存活而保持存活的线程创建“守护进程”。顺便说一下,主线程始终是非守护进程。

关于Python 套接字接受 block - 防止应用程序退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1148062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com