使用 Python BaseHTTPServer 处理同时/异步请求

2023-12-21

我通过创建一个继承自 HTTPServer 和 ThreadingMixIn 的类来设置一个线程(使用 Python 线程)HTTP 服务器:

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    pass

我有一个继承自 BaseHTTPRequestHandler 的处理程序类,我用如下方式启动服务器:

class MyHandler(BaseHTTPRequestHandler):
    ...

server = ThreadedHTTPServer(('localhost', 8080), MyHandler)
# Prevent issues with socket reuse
server.allow_reuse_address = True
# Start the server
server.serve_forever()

这一切都非常简单。我遇到的问题是,ThreadingMixIn、ForkingMixIn 或其他方式,请求最终会阻塞请求处理程序返回。通过实现以下示例代码可以轻松看出这一点:

class MyHandler(BaseHTTPRequestHandler):
    def respond(self, status_code):
        self.send_response(status_code)
        self.end_headers()

    def do_GET(self):
         print "Entered GET request handler"
         time.sleep(10)
         print "Sending response!"
         respond(200)

如果服务器同时处理这些请求,那么我们将能够发送两个请求,并看到服务器在发送任一响应之前输入两个 GET 请求处理程序。相反,服务器将输入第一个请求的 GET 请求处理程序,等待它返回,然后输入第二个请求(因此第二个请求大约需要 20 秒才能返回,而不是 10 秒)。

有没有一种简单的方法可以让我实现一个服务器不等待处理程序返回的系统?具体来说,我正在尝试编写一个系统,该系统在返回任何请求之前等待接收多个请求(一种长轮询的形式),并遇到第一个请求等待阻止任何未来请求连接到服务器的问题。


class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    pass

足够。您的客户端可能不会发出并发请求。如果您并行发出请求,线程服务器将按预期工作。这是客户:

#!/usr/bin/env python
import sys
import urllib2

from threading import Thread

def make_request(url):
    print urllib2.urlopen(url).read()

def main():
    port = int(sys.argv[1]) if len(sys.argv) > 1 else 8000
    for _ in range(10):
        Thread(target=make_request, args=("http://localhost:%d" % port,)).start()

main()

以及对应的服务器:

import time
from BaseHTTPServer   import BaseHTTPRequestHandler, HTTPServer, test as _test
from SocketServer     import ThreadingMixIn


class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    pass

class SlowHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/plain")
        self.end_headers()

        self.wfile.write("Entered GET request handler")
        time.sleep(1)
        self.wfile.write("Sending response!")

def test(HandlerClass = SlowHandler,
         ServerClass = ThreadedHTTPServer):
    _test(HandlerClass, ServerClass)


if __name__ == '__main__':
    test()

所有 10 个请求都会在 1 秒内完成。如果您删除ThreadingMixIn根据服务器定义,所有 10 个请求都需要 10 秒才能完成。

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

使用 Python BaseHTTPServer 处理同时/异步请求 的相关文章

随机推荐

  • 在elasticsearch中过滤_id范围

    我正在尝试按范围过滤 elasticsearch 中的 id 字段 索引未启用 是否可以 如果可以的话 可以怎样做呢 我在elasticsearch文档中读到我们可以使用 ids 通过 id和类型进行查询 但我不知道如何使用范围过滤器来完成
  • as3 播放影片剪辑一次

    如果您帮助我解决这个问题 我将非常感激 我正在尝试在 ipad 应用程序中播放一次 MovieClip 我试图以这种方式停止 但电影不会停止 var loader Loader new Loader var swfFile URLReque
  • PHP - 将 2d 数组转换为按特定值分组的 3d 数组的最快方法

    我想转换这个二维记录数组 records gt Array 0 gt Array 0 gt Pears 1 gt Green 2 gt Box 3 gt 20 1 gt Array 0 gt Pears 1 gt Yellow 2 gt P
  • 数据表列未对齐和重复排序箭头问题

    每次我显示表格时 我都会在表格中添加一个额外的排序箭头 th Here is an image of the issue I also am having an issue with my columns not aligning corr
  • Spring Security 和多部分请求

    我有一个受 Spring Security 和 OAuth2 保护的 Controller 我试图让我的用户上传文件 Controller RequestMapping value api image public class ImageC
  • OpenCV:选择颜色过滤的 HSV 阈值

    为了从图像中过滤出某种颜色 有必要设置需要检测的颜色的边界 我有一种感觉 这主要是一个试错过程 有没有什么方法可以快速找到特定颜色的正确阈值 在这种特定情况下 我试图检测下图中图表的灰色区域 当然 这没有检测到虚线 对于这个例子 我需要非常
  • 如何在 NSPasteBoard cocoa os x 中复制图像?

    I have tried this one but not working NSPasteboard pboard NSPasteboard generalPasteboard pboard declareTypes NSMutableAr
  • 网络设备发现

    对于我的 Android 应用程序 用户需要连接到托管在同一 LAN 上某处的服务器 同一 LAN 上可以托管多个服务器 为了方便用户 我打算扫描 Android 设备当前连接的 LAN 然后列出所有运行服务器的网络设备 而不是让用户将 I
  • 发布请求被切断

    我的 javascript 发布请求有问题 我有以下代码用于发送帖子请求 var xhttp new XMLHttpRequest xhttp onreadystatechange function if this readyState 4
  • Spark 和 Cassandra Java 应用程序:线程“主”java.lang.NoClassDefFoundError 中出现异常:org/apache/spark/sql/Dataset

    我得到了一个令人惊奇的 siplme java 应用程序 我几乎从这个例子中复制了它 我想做的就是读取表数据并显示在 Eclipse 控制台中 我的 pom xml
  • 减少 Android 应用程序 (apk) 的大小

    我现在将在 Google Play 商店上发布我的第一个应用程序 我已经压缩了我的应用程序中使用的图像 我对应用程序大小有一些疑问 如果应用程序的大小小于 2 MB 则用户卸载该应用程序的可能性较小 对于属于教育领域的应用程序 我的这种说法
  • 一个 Hive 脚本可以从另一个 Hive 脚本运行吗?

    我创建了两个配置单元脚本 script1 hql 和 script2 hql 是否可以从 script1 hql 运行脚本 script2 hql 我读到了有关使用 source 命令的信息 但无法回避它的使用 任何指针 参考文档将不胜感激
  • 如何使用“Entity Framework Core”(又名 EF7)实现“软删除”?

    我正在尝试使用 EF7 实现 软删除 我的Item表有一个名为IsDeleted类型的bit 我在 SO 和其他地方看到的所有例子都使用这样的东西 protected override void OnModelCreating ModelB
  • PHPExcel 获取相对于给定列的列名

    使用 PHPExcel 是否可以获取位于左侧或右侧 X 列的列的名称 例如 给定列 BZ 我想返回列名称 CB 或 BX 向右或向左 2 个 Thanks PHPExcel 中已经内置了一些函数来帮助您执行此操作 adjustment 2
  • 进行多线程 foreach 循环的最佳方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个带有 foreach 的发送电子邮件方法 如下所示 static void Main string args foreach
  • 创建一个可供 Android 中所有 Activity 访问的对象

    我正在尝试创建一个包含对象的数据数组列表 例如地址和属性列表 非常复杂 并且想知道 如何使所有活动都可以访问 和可编辑 一个对象 而不仅仅是它本身实例化于 基本上是这样的 在活动 1 中创建数组 在活动 2 和活动 3 中访问相同的数组 P
  • 以编程方式打开组合框下拉列表[重复]

    这个问题在这里已经有答案了 是否有可能directly以编程方式打开 WindowsForms 组合框 还没有找到这样做的方法或属性 如果没有 有哪些可能的解决方案不涉及大量黑客攻击 Use ComboBox DroppedDown htt
  • Unix/Linux 系统调用是 POSIX 库函数的一部分吗?

    Unix Linux 系统调用全部或大部分是 POSIX 中的吗 许多Linux Unix编程书籍都说POSIX库函数可能是OS系统调用的包装器 也可能不是 例如 http www makelinux net books lkd2 ch05
  • jquery获取矩形宽度和高度传单

    我有一张地图和一个区域选择字段 initialize map var map L map map setView 38 0 2 L tileLayer http s tile cloudmade com 70146506bc514228ad
  • 使用 Python BaseHTTPServer 处理同时/异步请求

    我通过创建一个继承自 HTTPServer 和 ThreadingMixIn 的类来设置一个线程 使用 Python 线程 HTTP 服务器 class ThreadedHTTPServer ThreadingMixIn HTTPServe