python - 如何中断在 Python 的不同线程中运行的 socket.accept()?

标签 python multithreading sockets

我想编写一个接受 tcp 连接的服务器,但我不想在调用 socket.accept() 时阻塞主线程,所以我想将网络放在不同的位置线。我已经看到在 Python 中无法中断线程,现在我想知道如何正确停止 socket.accept() 调用。

我想要的解决方案类似于 Java,例如:

class TcpServer:
    def waitForConnection():
        try:
            conn, addr = socket.accept()
        except ThreadInterrupt:
            # Close server ...

不幸的是,这个“ThreadInterrupt”并不存在。那么,我怎样才能实现这种行为呢?预先感谢每个提示。

最佳答案

您可以将套接字设置为非阻塞操作,并等待旧的 select 调用为它准备好 accept(当它变得可读时 第一次)。附加值是您可以监听另一个文件 描述符,例如管道,这样您就可以进行特权通信 channel 与你的线程,你可以随时退出线程:

import select
import socket
import os

class TcpServer:
    def __init__(self, ...):
        self.r_channel, self.w_channel = os.pipe() 
        self.socket = ...
    def waitForConnection(self):
        rfds, _, _ = select.select([self.socket.fileno(), self.r_channel],[],[])
        if self.r_channel in rfds:
            # close server
            ...
        self.socket.accept() # this won't block

# if you want to interrupt waitForConnection, from main thread:
os.write(tcp_server_object.w_channel, '!') # write something, just to wake up the select call

关于python - 如何中断在 Python 的不同线程中运行的 socket.accept()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32734866/

相关文章:

python - str.replace() 或组合两个切片是删除字符的更好方法吗?

python - 使用 python 和 lxml 模块从 html 中删除所有 javascript 标签和样式标签

python - celery 节拍时间表 : run task instantly when start celery beat?

multithreading - Delphi 当应用程序在线程等待事件时终止时会发生什么?

c++ - QTcpSocket重连方式

Java写入关闭的输出流不抛出ioexception

python - 将积分分解为椭圆积分

objective-c - 有没有办法检查是否获得了 NSLock?

c# - 如何使事件回调进入我的 win 表单线程安全?

带有 NAT 和动态 DNS 的 Java 服务器套接字