将套接字对象发送到分叉运行进程(multiprocessing.Queue)

2023-11-26

我正在学习使用 HTML5 WebSockets,作为学习的一部分,我正在用 Python 编写一个服务器,这样我就可以了解它们如何工作的细节。前几天我创建了一个效果很好的应用程序,但我想扩展它,以便它支持多个端点,每个端点都是一个不同的“服务”,可以处理 websocket 客户端。

目前,我的实现适用于生成进程等(我使用多处理而不是线程,因为我读到线程在 CPython 中并不是真正的多线程,这就是我认为我正在使用的(Ubuntu 12.04 上的默认安装)),但是我在将收到的客户端套接字发送到服务进程时遇到问题。

这是我发送它们的方式(这在循环中运行):

try:
    #get a new client
    conn, addr = server.accept()
    print "Client connected from", addr
    request = conn.recv(4096)
    response, close, service = self.handshake(request)
    conn.send(response)
    if close:
        print "Invalid request from", addr
        conn.close()
        continue
    client = WebSockets.WebSocketClient(conn, addr)
    service.clientConnQueue.put(client)

“server”是一个监听传入连接的套接字。握手方法负责验证他们的请求并确定将客户端放入哪个服务进程。 'response' 是要发送的 http 响应,'close' 如果出现错误则为 True,'service' 是继承自 multiprocessing.Queue 的类。 WebSocktes.WebSocketClient 是我的发送和接收实现的存储位置,它基本上充当套接字的包装器。

'clientConnQueue' 的创建方式如下:

class Service(multiprocessing.Process):
    """Base class for all services."""
    def __init__(self, manager):
        multiprocessing.Process.__init__(self)
        self.manager = manager
        self.clientConnQueue = self.manager.Queue()
        self.shutdownFlag = multiprocessing.Event()

manager 是一个 multiprocessing.Manager()

当我尝试将客户端放入 clientConnQueue 时出现的错误如下:

File "./WebSocketServer.py", line 183, in <module>
main()
File "./WebSocketServer.py", line 180, in main
server.runServer()
File "./WebSocketServer.py", line 67, in runServer
service.clientConnQueue.put(client)
File "<string>", line 2, in put
File "/usr/lib/python2.7/multiprocessing/managers.py", line 758, in _callmethod
conn.send((self._id, methodname, args, kwds))
TypeError: expected string or Unicode object, NoneType found

然后我在接收端收到管道损坏错误。

当我使用 multiprocessing.Queue 发送连接时,我遇到了同样的错误,我认为将其更改为管理器创建的队列可以解决问题。然而,它似乎做了完全相同的实现。

显然,这不是将此类内容发送到正在运行的进程的方式,那么将不可序列化对象发送到进程的正确方法是什么?


将套接字传递给另一个进程并不是一件小事。例如,看看这个问题:我可以打开一个套接字并将其传递给 Linux 中的另一个进程吗

不管怎样,操作系统进程或线程并不是你真正想要的实现 websocket 服务器,因为内存开销很大。看看带有非阻塞套接字的东西......例如,Tornadohttp://www.tornadoweb.org/documentation/websocket.html

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

将套接字对象发送到分叉运行进程(multiprocessing.Queue) 的相关文章

随机推荐

  • pandas 将一列的一部分替换为另一列

    我有一个 pandas 数据框 我们称之为data data有两列 列a和列b 像这样 a b 0 aaa tts 1 abb tst 2 aba tss 我想更换每个 a 在列中a带柱b 像这样 a b 0 ttsttstts tts 1
  • 如何在bash中分割由/分隔的字符串

    我必须在 bash 脚本中用 分割字符串 但我尝试过 for i in echo www tr 但它不起作用 有什么建议吗 多谢 IFS read a foo lt lt lt abc def ghi jkl echo foo 0 foo
  • 错误[E0463]:在为 wasm32-unknown-unknown 构建 Rust 项目时找不到“core”的包

    我收到以下错误消息 error E0463 can t find crate for core note the wasm32 unknown unknown target may not be installed error aborti
  • 计算对象中非空字段的数量

    我有一个UserProfile包含用户数据的类 如下所示 class UserProfile private String userId private String displayName private String loginId p
  • 带有容器和默认分配器的模板模板参数:我可以使我的声明更紧凑吗?

    我正在看这个有趣的话题 https stackoverflow com a 16596463 2436175 我的具体案例涉及使用 opencv 中的 cv Point 和 cv Rect 的 std 容器声明模板化函数 我想要针对以下模板
  • spoj ARRAYSUB:O(n) 复杂度方法

    我试图在 spoj 上解决这个问题http spoj pl problems ARRAYSUB 我用两种方法解决了这个问题 首先使用优化的蛮力 其次在 k 2k 3k 等处进行枢轴并找到最大值 尽管这两种解决方案在最坏情况下都被接受 但复杂
  • 订阅 Meteor.Users 集合

    in server js Meteor publish directory function return Meteor users find fields emails 1 profile 1 in client js Meteor su
  • 强制对象评估为 false

    我猜这可能是特定于应用程序的 但我使用的是node js 只要它在v8引擎中工作 我不介意 我正在尝试创建一个Object评估结果为 false 例如 var Foo function return this var bar new Foo
  • java file.renameTo() 确实重命名文件但返回 false。为什么?

    问题是我需要在其余逻辑工作之前移动文件 因此当该方法返回 false 时我停止执行 但是 当我在 Windows 资源管理器中检查该文件时 它有一个新名称并且已移动 只是好奇为什么会发生这种情况 这是我刚刚尝试重现问题的一些示例代码 这几乎
  • iOS 10 中收不到推送通知

    我的应用程序在 Appstore 中 推送通知在 iOS 9 中工作正常 但在 iOS 10 中不起作用 我没有收到任何 iOS 10 设备的推送通知 我已检查服务器中的设备令牌和证书 全部正确 我还检查了设置应用程序中的通知属性 一切都很
  • 释放鼠标捕获并让鼠标点击通过

    我有一个类似于弹出窗口或菜单的控件 我想显示它 当用户单击框的边界之外时 让它隐藏自己 我使用了 Mouse Capture this CaptureMode SubTree 并以与 OnLostMouseCapture 中的 Menu P
  • google.colab 模块中是否有一个函数可以关闭运行时

    有时 当我在 google colab 中运行时 当运行完成时 我无法留在计算机前手动断开与服务器的连接 即使我的运行已完成 无缘无故占用节点 连接仍保持打开状态 google colab 中是否有一个函数 可以让我插入该函数以在一些纪元后
  • Tensorflow如何恢复具有不同名称但相同形状的权重?

    我在 Tensorflow 中有多种架构 其中一些共享某些部件的设计 我想训练其中一个网络 并在另一个网络中使用相似层的训练权重 此时 我可以保存所需的权重 并将它们重新加载到具有完全相同的变量命名约定的架构中 然而 当两个网络中的权重名称
  • Swing Worker:函数 get()

    我的问题是我不明白如何swingworker有效 因为我想做的是fa worker get 因为我有一个很长的方法 可以计算在后台运行的很多点 因为我不想冻结我的界面 并且我想得到她的结果来绘制组件图像 但我不明白当我这样做时它会去哪里fa
  • 如何检测 html 元素是否可以追加子节点?

    我在我的应用程序中创建了一个名为 loading 的自定义 jquery 事件 当触发此事件时 我想附加一个带有微调器的屏蔽元素 我可以毫无问题地弄清楚那部分 但是 某些元素 图像 表单输入等 无法附加子元素 我需要能够检测此事件的目标是否
  • Android 片段 - findViewById 返回 null [重复]

    这个问题在这里已经有答案了 我有一个在互联网上似乎很常见的问题 我创建了一个仅包含片段的活动 这是生成的代码 Override protected void onCreate Bundle savedInstanceState super
  • Pandas 数据框列值不区分大小写替换 where

    pandas DataFrame replace 是否有不区分大小写的版本 https pandas pydata org pandas docs version 0 21 generated pandas DataFrame replac
  • 用条件列绘制 pandas DataFrame

    我有这种 pandas DataFrame a b 是获取 x 和 y 时的条件 df pd DataFrame 10 20 0 1 10 20 1 5 100 200 0 33 100 200 1 11 columns a b x y d
  • 如何使用 Liquibase 创建数据库

    我正在尝试使用Liquibase创建数据库not exists 我已经下载了MySQL并且没有对其进行任何更改 我的 Maven 插件代码看起来像
  • 将套接字对象发送到分叉运行进程(multiprocessing.Queue)

    我正在学习使用 HTML5 WebSockets 作为学习的一部分 我正在用 Python 编写一个服务器 这样我就可以了解它们如何工作的细节 前几天我创建了一个效果很好的应用程序 但我想扩展它 以便它支持多个端点 每个端点都是一个不同的