如何重新启动 BaseHTTPServer 实例?

2024-01-01

这就是我所拥有的:

http.py:

class HTTPServer():

    def __init__(self, port):
        self.port = port
        self.thread = None
        self.run = True
    def serve(self):
        self.thread = threading.Thread(target=self._serve)
        self.thread.start()
    def _serve(self):
        serverAddress = ("", self.port)
        self.server = MyBaseHTTPServer(serverAddress,MyRequestHandler)
        logging.log(logging.INFO, "HTTP server started on port %s"%self.port)
        while self.run:
            self.server.handle_request()
    def stop(self):
        self.run = False
        self.server.server_close()

然后在另一个文件中重新启动它:

def restartHTTP(self):
    try:
        self.httpserver.stop()
        reload(http)
        self.httpserver = http.HTTPServer(80)
        self.httpserver.serve()
    except:
        traceback.print_exc()

这给了我一个地址已在使用错误,所以看起来 HTTP 服务器没有正确停止。我还需要做什么来阻止它?

EDIT:

我在哪里调用 restartHTTP:

def commandHTTPReload(self, parts, byuser, overriderank):
    self.client.factory.restartHTTP()
    self.client.sendServerMessage("HTTP server reloaded.")

我确实知道该命令正在执行,因为我收到了它应该发送的消息。


您只需让操作系统知道您确实希望在关闭端口后立即重用该端口。通常它会保持关闭状态一段时间,以防出现任何额外的数据包。您可以使用 SO_REUSEADDR 执行此操作:

mysocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

..打开 mysocket 后。使用 HTTPServer 执行此操作的好地方可能是在重写的server_bind method:

def server_bind(self):
    HTTPServer.server_bind(self)
    self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

编辑:更仔细地查看您的代码后,我发现您的线程模型也可能在这里引起问题。您正在主(?)线程中关闭套接字,而另一个线程正在等待同一套接字上的连接(在accept())。这种安排没有明确定义的语义,我相信它在不同的操作系统上会做不同的事情。无论如何,为了最大程度地减少混乱(在多线程程序中已经存在很多这样的情况),您应该避免这种情况。您的旧线程实际上不会消失,直到它获得连接并处理其请求之后(因为它不会重新检查self.run直到那时),因此在此之后该端口可能无法重新绑定。

对此确实没有一个简单的解决方案。您可以在线程之间添加通信管道,然后使用select()/poll()在服务器线程中等待其中任何一个的活动,或者您可以超时accept()短时间后调用,以便self.run被更频繁地检查。或者您可以让主线程连接到侦听套接字本身。但无论你做什么,你可能会接近复杂程度,你应该考虑使用“真正的”httpd 或网络框架,而不是滚动你自己的:apache、lighttpd、Tornado、Twisted 等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重新启动 BaseHTTPServer 实例? 的相关文章

  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • Python、Tkinter、更改标签颜色

    有没有一种简单的方法来更改按钮中文本的颜色 I use button text input text here 更改按下后按钮文本的内容 是否存在类似的颜色变化 button color red Use the foreground设置按钮
  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 如何生成给定范围内的回文数列表?

    假设范围是 1 X 120 这是我尝试过的 gt gt gt def isPalindrome s check if a number is a Palindrome s str s return s s 1 gt gt gt def ge
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • feedparser 在脚本运行期间失败,但无法在交互式 python 控制台中重现

    当我运行 eclipse 或在 iPython 中运行脚本时 它失败了 ascii codec can t decode byte 0xe2 in position 32 ordinal not in range 128 我不知道为什么 但
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject

随机推荐

  • Rails 4 跨子域会话

    我正在尝试以下方法 但没有成功尝试跨子域保留会话 MyApp Application config session store cookie store key myapp session domain gt all tld length
  • Django 1.6 中的静态文件

    我可能在这里做错了很多事情 因为尽管严格遵循了教程 但我仍然无法让静态文件在我的开发环境中正常工作 我有一种感觉 因为它在 Django 1 6 中的工作方式略有不同 而且我只能找到以前版本的答案 这是我的目录结构 mysite app1
  • Xcode 12.5:SPM 依赖项缓存位置

    Swift 包管理器有了新的Xcode 12 5 中的功能 https developer apple com documentation xcode release notes xcode 12 5 beta release notes
  • BigQuery:如何通过窗口函数合并 HLL 草图? (在滚动窗口上计算不同值)

    相关表架构示例 activity date TIMESTAMP user id STRING 2017 02 22 17 36 08 UTC fake id i24385787 2017 02 22 04 27 08 UTC fake id
  • 将元组有效地处理为固定大小的向量

    在 Chapel 中 同构元组可以像小的 向量 一样使用 例如 a b c 3 0 5 0 但是 由于没有为元组提供各种数学函数 因此我尝试编写一个函数norm 并通过多种方式比较了它们的性能 我的代码是这样的 proc norm 3tup
  • MYSQL使用范围/限制对数据的所有行和分页进行计数

    我不知道这是否是重复的 但这是我的问题 我试图实现从数据库中获取的数据的分页 我的困境是 我应该进行分页 分组查询数据吗 5 使用限制 范围进行选择 然后将它们显示在带分页的表格中 它将有页码 因此需要计算所有表条目 因此初始显示将需要 2
  • WordPress 本地主机不工作[重复]

    这个问题在这里已经有答案了 我是 WordPress 新手 所以请帮忙 我知道已经存在一些与此相关的问题 但它不起作用 因此寻求帮助 我已经克隆了一个实时存储库并将其保存在我的 WAMP www 文件夹中 该文件夹通常用于其他 php 站点
  • 将 Numpy 数组重塑为形状为 (n, n, n) 的立方体的字典顺序列表

    为了理解我想要实现的目标 让我们想象一个 ndarraya有形状 8 8 8 我从中按字典顺序选取形状块 4 4 4 因此 在迭代这些块时 索引将如下所示 0 a 0 4 0 4 0 4 1 a 0 4 0 4 4 8 2 a 0 4 4
  • 如何反序列化大 JSON 文件 (~300Mb)

    我想解析一个JSON文件 大小 300Mb 我用Jackson图书馆和ObjectMapper 如果我出现记忆问题 这正常吗 第一次 我使用BufferedReader 它会使应用程序崩溃 接下来 我使用这个库 解析并保存到SQLite数据
  • 找到一对没有交集的对

    Given a set of n pairs of integers is there a fast way to determine if there exists two pairs x1 y1 and x2 y2 so that th
  • Xamarin Toast 消息错误 (C#)

    我想显示一条吐司消息 如果我在 onCreate 中执行此操作 效果会很好 但我想这样做 但出现错误 Java Lang NullPointerException 尝试调用虚拟方法 android content res Resources
  • GCC 链接器脚本 - 将 .bss 部分分割到多个 RAM 区域

    嵌入式设备有两个 SRAM 区域 首先位于 0x20000000 长度为 16k 然后在 0x20040000 处长度为 96k 在应用程序中 生成的 bss 部分大小为 102k 因此它不完全适合任一 RAM 区域 它需要在两个区域之间划
  • 属性路由在区域中不起作用

    场景 我的 ASP NET MVC 5 站点中有一个表单区域 我正在尝试重定向到详细信息操作 该操作使用使用新的属性路由功能定义的自定义路由 重定向到操作 return RedirectToAction Details new slug 我
  • 使用 OpenSSL 解密 .ts 文件

    一切都在同一个目录中 M3u8 文件 EXTM3U EXT X ALLOW CACHE NO EXT X TARGETDURATION 10 EXT X MEDIA SEQUENCE 0 EXT X KEY METHOD AES 128 U
  • Bootstrap 模式样式的位置固定关闭按钮在 Internet Explorer 中无法正确显示

    我正在开发一个网站 该网站使用了引导程序3 0 2版本 我设计了一个模态关闭按钮 它可以在除 Internet Explorer 之外的所有浏览器中正确显示 我已在 ie 11 上检查过 基本上 为了让它看起来像这样 我用过这个CSS mo
  • Django 过滤器错误:“Meta.fields”不得包含非模型字段名称

    我正在使用 Django REST 框架和 django filters 并且我想使用反向关系annotation set作为过滤器之一GET使用模型的 APIDetection 型号如下 class Detection models Mo
  • 使用 React Native 获取设备令牌

    有没有办法通过本机反应获取按需通知的设备令牌 从文档来看 令牌暴露的唯一时间似乎是在 PushNotification 注册事件上 更一般地说 处理设备令牌的常见做法是什么 如果一名用户登录我的应用程序 该应用程序会向 PushNotifi
  • JQuery:根据另一个元素更改高度

    我有两个 DIV 一个 DIV 根据浏览器动态更改大小 响应式设计 我希望另一个 DIV 根据第一个 DIV 的高度修改其高度 我认为最简单的方法是使用 JQuery 动态更改高度 我尝试了以下方法 section div2 css hei
  • 创建分割档案(zip、rar、7z)?

    简而言之 I need使用虚拟安全格式将单个 或多个 文件拆分为多个最大大小的存档 例如 zip 或 rar 任何有效的文件都可以 I 会爱知道某个部分何时完成 回调 这样我就可以开始将其运走 I would 而不是除非不可能 否则请使用
  • 如何重新启动 BaseHTTPServer 实例?

    这就是我所拥有的 http py class HTTPServer def init self port self port port self thread None self run True def serve self self t