当前位置: 首页 > 面试题库 >

具有多处理工人的扭曲的网络客户端?

薛华奥
2023-03-14
问题内容

因此,我有一个使用Twisted + Stomper作为STOMP客户端的应用程序,该应用程序将工作分配给多处理程序。

当我只是使用python脚本启动它时,这似乎可以正常工作,(简化)如下所示:

# stompclient.py

logging.config.fileConfig(config_path)
logger = logging.getLogger(__name__)

# Add observer to make Twisted log via python
twisted.python.log.PythonLoggingObserver().start()

# initialize the process pool.  (child processes get forked off immediately)
pool = multiprocessing.Pool(processes=processes)

StompClientFactory.username = username
StompClientFactory.password = password
StompClientFactory.destination = destination
reactor.connectTCP(host, port, StompClientFactory())
reactor.run()

当打包打包以进行部署时,我想我将利用扭曲的脚本并从tac文件中运行它。

这是我看起来非常相似的tac文件:

# stompclient.tac

logging.config.fileConfig(config_path)
logger = logging.getLogger(__name__)

# Add observer to make Twisted log via python
twisted.python.log.PythonLoggingObserver().start()

# initialize the process pool.  (child processes get forked off immediately)
pool = multiprocessing.Pool(processes=processes)

StompClientFactory.username = username
StompClientFactory.password = password
StompClientFactory.destination = destination

application = service.Application('myapp')

service = internet.TCPClient(host, port, StompClientFactory())
service.setServiceParent(application)

为了说明起见,我已经折叠或更改了一些细节。希望它们不是问题的实质。例如,我的应用程序有一个插件系统,该池由一个单独的方法初始化,然后使用pool.apply_async()将我的插件的process()方法之一传递给该池。

因此,如果我运行脚本(stompclient.py),一切都会按预期进行。

如果我在非守护程序模式(-n)中运行Twist,它似乎也可以正常工作:

twistd -noy stompclient.tac

但是,它并 没有 ,当我在守护模式下运行的工作:

twistd -oy stompclient.tac

该应用程序似乎启动正常,但是当它尝试分派工作时,它只是挂起。“挂起”是指似乎从未要求子进程执行任何操作,而父进程(称为pool.apply_async())只是坐在那里等待响应返回。

我确定我在Twisted +多处理方面做的很愚蠢,但是我真的希望有人可以向我解释我的方法的缺陷。

提前致谢!


问题答案:

由于您的工作调用与非工作调用之间的区别仅是“ -n”选项,因此问题很可能是由守护进程引起的(“ -n”阻止了此事件的发生)。

在POSIX上,守护进程涉及的步骤之一是派生并具有父出口。其中,其结果是使您的代码在与评估.tac文件不同的过程中运行。这也重新排列了.tac文件中启动的进程的子级/父级关系-
就像您的多进程进程池一样。

多处理池的进程从您启动的扭曲进程的父进程开始。但是,当该进程作为守护进程的一部分退出时,它们的父进程将成为系统初始化进程。这可能会导致一些问题,尽管可能不是您描述的问题。可能还有其他类似的低层实现细节,这些细节通常允许多处理模块工作,但会被守护进程破坏。

幸运的是,避免这种奇怪的相互作用应该很简单。Twisted的服务API允许您在守护程序完成后运行代码。如果使用这些API,则可以将多处理模块的进程池的初始化延迟到守护进程之后,并希望避免该问题。这是一个可能看起来像的例子:

from twisted.application.service import Service

class MultiprocessingService(Service):
    def startService(self):
        self.pool = multiprocessing.Pool(processes=processes)

MultiprocessingService().setServiceParent(application)

现在,分别地,您可能还会遇到与清理多处理模块的子进程有关的问题,或者可能是与通过Twisted的进程创建API
Reactor.spawnProcess创建的进程有关的问题。这是因为正确处理子进程的一部分通常涉及处理SIGCHLD信号。但是,在这方面,扭曲和多处理不会合作,因此,其中一个将通知所有退出的孩子,而另一个将永远不会被通知。如果您根本不使用Twisted的API创建子进程,那么这对您来说可以-
但您可能要检查以确保多处理模块尝试安装的任何信号处理程序实际上“成功”并且没有得到替换为Twisted自己的处理程序。



 类似资料:
  • 我实现了一个相当简单的服务器,可以处理多个客户端,我首先接受这样的客户端 从我所读到的内容来看,似乎通常会为每个客户端创建一个新线程,但如果有更简单的方法,我真的不认为有必要解决这个问题。我只需要能够在服务器和客户端之间发送和接收消息。 有没有简单的方法 监听传入消息 确定消息来自哪个客户端 解析消息等。 都在一个循环中,而不为每个客户端创建单独的线程?

  • 问题内容: 如何创建也是客户端的扭曲服务器?我希望反应堆在监听的同时,也可以用于连接到也可以连接和监听的同一服务器实例。 问题答案: 致电和。您可以根据需要拥有多种连接类型-服务器或客户端。 例如:

  • 我们提供了一些网络工具来为你操作并使用网路信息提供便捷,比如说获取ip,发送邮件等。 WebUtils 方法原型: getFileFromUrl( $url ) 静态方法, 从网络地址中获取文件路径,也就是把网络地址转换成文件路径。 参数名称 参数类型 参数说明 $url string 要处理的url @return string 返回文件路径 方法原型: getClientIP() 静态方法,获

  • 最大消息长度为64K字节(尽管我可以将其减少到256字节)。 注意:这将运行在一个微小的嵌入式设备上,所以使用像ZMQ这样的消息传递层不是一个选项(没有足够的内存)。 我可以:

  • 7.1. 查询网络服务和端口 netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。 列出所有端口 (包括监听和未监听的): netstat -a 列出所有 tcp 端口: netstat -at 列出所有有监听的服务状态: netstat

  • 由来 在日常开发中,网络连接这块儿必不可少。日常用到的一些功能,隐藏掉部分IP地址、绝对相对路径的转换等等。 介绍 NetUtil 工具中主要的方法包括: longToIpv4 根据long值获取ip v4地址 ipv4ToLong 根据ip地址计算出long型的数据 isUsableLocalPort 检测本地端口可用性 isValidPort 是否为有效的端口 isInnerIP 判定是否为内

  • 概述 常用操作 项目初始化 库的安装 库的搜索和查看 库的更新和卸载 列出所有库 配置文件.bowerrc 相关链接 概述 随着网页功能变得越来越复杂,同一张网页加载多个JavaScript函数库早已是家常便饭。开发者越来越需要一个工具,对浏览器端的各种库进行管理,比如搜索、自动安装\卸载、检查更新、确保依赖关系等等。Bower就是为了解决这个问题而诞生的针对浏览器端的库管理工具。 Bower基于

  • Realtime networking is a complex field, but with Unity we have made it extremely simple to achieve. However, it is still best to understand the breadth and depth involved with creating any kind of net