Marshal (Ruby) 管道:将序列化对象发送到子进程

2023-11-29

我需要使用 Marshal 序列化 Ruby 中的对象,并通过管道将其发送到子进程。我怎样才能做到这一点?

我的代码如下所示,我的问题在评论中:

data = Marshal.dump(data)
#call sub-process
`ruby -r a_lib -e 'a_method'` #### how to send the stdout to the subprocess?

a_method 看起来像:

def a_method
  ...
  data = Marshal.load(data) #### how to load the stdout of the parent process?
  ...
end

是的,您可以通过管道在不同的 ruby​​/非 ruby​​ 进程之间发送序列化对象!

让我向您展示我是如何做到的。

在此示例中,主进程启动子进程,然后子进程使用 Marshal 序列化传输简单的 Hash 对象。

主源码:

首先声明一些辅助方法会很有用run_ruby在进程类中:

#encoding: UTF-8
require 'rbconfig'
module Process
  RUBY = RbConfig::CONFIG.values_at('bindir', 'BASERUBY').join('/')
# @param [String] command
# @param [Hash] options
  def Process.run_ruby(command, options)
    spawn("#{Process::RUBY} -- #{command}", options)
  end
end

此代码只是定位 ruby​​ 可执行文件并将完整路径保存到 RUBY 常量中。

重要的: 如果你要使用Jruby或其他一些可执行文件 - 您应该重写此代码并提供执行它的路径!

接下来,我们应该启动子进程。
此时我们可以重写STDIN, STDOUT and STDERR对于新流程。
让我们创建一个pipe并重定向孩子的STDOUT到这个管道:

  rd, wr = IO.pipe
  Process.run_ruby("./test/pipetest.rb param1 param2", {:out => wr})
  wr.close

请注意选项哈希:{:输出=> wr}- 它告诉spawn命令重定向STDOUT to wr流描述符。

此外,您还可以指定参数(请参阅param1 and param2)在命令行中。

请注意,我们调用wr.close因为在本例中我们没有在父进程中使用它。

master 如何接收对象:

message = rd.gets         # read message header with size in bytes
cb = message[5..-1].to_i  # message is in form: "data <byte_size>\n"
data = rd.read(cb)        # read message with binary object
puts "Parent read #{data.length} from #{cb} bytes:"
obj = Marshal::load(data) # unserialize object
puts obj.inspect

子源代码:

现在,序列化对象将如何传输?
首先孩子会序列化对象,
然后它将以以下形式发送父消息:"data <byte_size>\n"
之后它将发送序列化对象本身。
子进程将发送对象到STDOUT因为我们已经指定将此通道用作管道。

#encoding: UTF-8

# obj is an example Hash object to be transmitted
obj = {
    1 => 'asd',
    'data' => 255,
    0 => 0.55
}

data = Marshal::dump(obj)             # serializing object (obj)
$stdout.puts "data #{data.length}"    # sending message header
$stdout.write data                    # sending message itself
$stdout.flush                         # Important: flush data!

在上面的代码中,子进程只是输出一个序列化对象并终止。
当然,您可以编写更复杂的行为。
例如,我启动许多子进程,每个子进程共享同一根管子到父进程STDOUT。为了避免两个孩子同时写入管道的问题,我必须使用系统级互斥体(不是 Ruby Mutex)来控制对此管道的访问。

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

Marshal (Ruby) 管道:将序列化对象发送到子进程 的相关文章

  • 在 Ruby 中跨多个类实例记忆数据的好方法是什么?

    考虑 生成数据的对象的许多实例 如果每次运行只生成一次该数据 那就太好了 class HighOfNPeriods lt Indicator def generate data indicator data DataStream new 0
  • rvm编译安装ruby 2.5.0出错

    我正在尝试使用 rvm 安装 ruby 2 5 0 但出现错误 我在 Ubuntu 18 16 和现在的 Linux Mint Cinnamon 上尝试过 基本上我在运行安装 ruby 的代码之前所做的是 打开 GPG 密钥https rv
  • 获取块参数个数

    我需要获取给定块所采用的参数数量 例如 foobar 1 2 3 a b c def foobar x y z block need to obtain number of arguments in block which would be
  • SSL_connect 返回=1 errno=0 状态=SSLv3 读取服务器证书 B:证书验证仅在代理时失败

    这篇文章几乎重复了许多其他帖子 包括Rails 4 和 Ruby 2 Net HTTP SSL 请求 OpenSSL SSL SSLError SSL connect returned 1 errno 0 state SSLv2 v3 re
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 红宝石边缘情况

    ruby 有一些边缘情况很难解释 因为解析会带来一些有趣的问题 我在这里列出其中两个 如果您知道更多 请添加到列表中 def foo 5 end this one works if tmp foo puts tmp to s end How
  • 捆绑安装无法从 https://rubygems.org/ 获取规格

    我正在尝试遵循 Hartl Rails 教程 但在使用捆绑器 gem 时遇到了问题 使用命令 bundle install 或 bundle update 时 我得到以下输出 从中获取源索引https rubygems org https
  • 如何计算带有偏移量的异或?

    我想用不同的偏移量进行异或计算以在计算中列出 例子 key 0 1 0 text 0 1 0 1 0 1 0 1 1 1 异或计算 key 0 text 0 key 1 text 1 key 2 text 2 key 0 text 3 ke
  • Ruby 枚举器中的“break”与“raise StopIteration”

    如果我使用 Ruby Enumerators 来实现生成器和过滤器 generator Enumerator new do y x 0 loop do y lt lt x x 1 break if x gt CUTOFF end end l
  • Ruby 中的任务/未来

    代表潜在延迟的异步计算并且可以订阅其完成的模式的惯用 Ruby 模拟是什么 即类似于 NET 的东西System Threading Task 或Python 3 xconcurrent futures future 请注意 这并不一定意味
  • Heroku 部署错误

    在 Windows 环境中 尝试部署到 Heroku 时出现以下错误 C Ruby lib ruby gems 1 8 gems heroku 1 9 13 lib heroku commands base rb 32 in 没有这样的文件
  • Rails 3 在 Ruby 1.9.2 上初始化非常慢

    我使用 RVM 来管理环境 安装了 Ruby 1 9 2 p136 我认为是最新版本 和 Rails 3 创建了 gemset 并运行捆绑器 到目前为止一切正常 但 Rails 在运行命令 即生成 销毁 rake 等 时初始化速度非常慢 完
  • 多重要求和允许强参数rails 4

    在下面的情况下 我尝试使用强参数 我想要求email address password并允许remember me fields 但像下面这样使用它只允许最后一行在方法示例中 在下面的情况下 它只需要params permit rememb
  • 如何从 ruby​​ 中的字符串中删除所有非数字?

    用户输入数字的形式如下 1 800 432 4567 800 432 4567 800 432 4566 800 432 4567 1 800 432 4567 800 432 4567 我希望所有这些都变成没有特殊字符的剥离版本 例如18
  • “rmagick”gem 安装问题

    我在尝试在 centos 上安装 rmagick gem 时遇到问题 以下是我得到的输出 谁能帮我识别一下我缺少什么包裹 我已经安装了所有提到的另一个堆栈溢出线程 RMagick安装错误 https stackoverflow com qu
  • Rails - 渲染:目标锚标记的操作?

    我希望像这样使用渲染 render action gt page form 我也尝试过这个 render template gt site page form 那也没用 这个特定页面上的表单位于最底部 如果提交时发生任何错误 我不希望用户被
  • Bundle 说 gem 丢失了 - 但事实并非如此?

    背景 我正在维护contentRuby On Rails 站点 但我确实没有 Rails 的经验 当尝试运行 Rails 服务器时 rails s我明白了 在任何来源中均找不到 activesupport 3 2 0 Run bundle
  • ruby 正则表达式匹配模式的多次出现

    我正在寻找构建一个 ruby 正则表达式来匹配模式的多次出现并将它们返回到数组中 模式很简单 即 两个左括号 一个或多个字符 后跟两个右括号 这就是我所做的 str Some random text lead first name and
  • Ruby 中的 DateTime.parse() 是否依赖于语言环境?

    我想知道以下示例的输出 解析时01 03 它会被解决为Mar 1st or Jan 3rd Ruby 不依赖于语言环境 因为红宝石是一个服务器端语言而不是客户端像 JavaScript 一样的语言 Ruby 使用系统时钟yourWeb 应用
  • 使用 ruby​​ 调整动画 GIF 图像的大小?

    我正在尝试将 GIF 图像调整为不同的尺寸 我在 ruby 中使用 RMagick 库 但对于某些 gif 图像 即使我缩小 GIF 的大小 文件大小似乎也会增加 我正在以相同的纵横比调整图像图像的大小 这是我的代码 require rma

随机推荐

  • sklearn.LabelEncoder 具有以前从未见过的值

    If a sklearn LabelEncoder已经在训练集上进行了拟合 如果在测试集上使用时遇到新值 它可能会崩溃 我能想到的唯一解决方案是将测试集中的所有新内容 即不属于任何现有类 映射到
  • servlet 3.0 导入包的注解

    在 Servlets 3 0 中 我们必须导入注释包 所以我想知道什么是类和接口 import javax servlet annotation WebServlet 这里的servlet annotation和WebServlet是jav
  • 删除全屏窗口装饰/边框 Chrome 操作系统应用/信息亭模式

    我有一个 Web 应用程序 我想在 chromebox 上以 kiosk 模式运行 到目前为止 我几乎已经一切正常 但我似乎无法摆脱屏幕周围烦人的大白色边框 屏幕左上角的屏幕截图 全屏 我添加了黑色边框来勾勒图像的轮廓 我的网络应用程序从蓝
  • 在 Pygame 中如何知道圆和矩形是否被触摸?

    在我的程序中 有一个圆和一个矩形在表面上移动 我想知道一个圆和一个矩形是否相互接触 它必须非常准确 很抱歉没有详细解释 但希望您能理解 考虑一个轴对齐的矩形由左上角原点以及宽度和高度给出 rect tl x y rect size widt
  • 如何使用 xunit test 比较两个列表

    我目前正在尝试使用 xUnit 比较两个列表 其中包含相同的项目 但在运行时出现错误 Assert Equal expectedList actualList Error Assert Equal Failure Expected List
  • Asp.Net MVC 中使用 DataTable 代替 Entity 框架

    如何在 Asp Net mvc 中使用 Datatable 而不是 Entity 框架 我指的是 asp net 网站上的本教程 http www asp net Learn mvc tutorial 21 cs aspx 我可以返回数据表
  • Java DateTimeFormatter 解析特殊字符

    我在正确使用我的格式时遇到了一些麻烦DataTimeFormatter解析日期时间String格式为 20200915095318 883 4 EDT 我有一个DateTimeFormatter模式可以产生这种格式 但不能解析相同的字符串
  • 如何初始化 VLAN 嗅探的原始套接字

    我正在尝试创建从不同 VLAN 嗅探 DHCP 提供的软件 但我的问题是我接收的数据包不包含 VLAN 标记 我正在使用原始套接字 并且尝试启用混杂模式 但无济于事 问题是如何指示内核保持数据包中的所有数据完好无损 使用wireshark时
  • 清理(​​单选按钮、复选框和<选项>)

    在 PHP 中 是否必须清理这些类型的输入 radio纽扣 checkboxes and
  • Vec> 的可变迭代器

    我正在尝试为类型向量创建一个可变迭代器 Vec
  • AngularJS UI Router:由于可选参数而导致路由冲突

    我的 AngularJS 应用程序中有几条路由 我使用 UI Router 在我的站点中的状态 页面之间进行路由 我遇到的一个问题是 由于我拥有 需要网站主页的可选参数 因此我的路线存在冲突 我有一个主页的路线 example com 或多
  • 解析一个'.'链式标识符列表,带有 qi::lexeme 并防止空格跳过

    我目前正在开发一个基于 Spirit 的表达式解析器 它应该允许最终 在遥远的未来 表达式 例如 a b c 10 20 x y z a b c a b e c d e 4 e f a b 23 d 23 b e a b c x y 成员访
  • Sequelize:原始数据和模型之间的映射

    我在使用原始查询从 MySQL 数据库检索数据时遇到一些问题 问题在于原始数据和sequelize 中定义的模型实例之间的映射 特别是那些在数据库中具有下划线名称并在模型中具有驼峰式名称的字段 我这样定义 Store 模型 sequeliz
  • 用于验证字符串中括号的 JS 函数

    伙计们 我想问你如何创建一个函数来检查字符串中的括号是否正确放置 例如 a b 4 2 c 5 我必须检查括号 我尝试了一些方法 但似乎不起作用 抱歉 我是 javascript 的新手 function checkBrackets str
  • 如何将文件从独立存储复制到下载文件夹?

    我正在尝试将数据库文件从独立存储复制到下载文件夹 或用户可以访问的任何文件夹 目前我的数据库存储在 data user 0 com companyname appname files Databases MyDatabase db 我尝试使
  • 无法删除 JTextPane 中 html 内容的额外行距

    我无法将 Java 中的行挤在一起JTextPane如果我将内容类型设置为text html 我希望它们像内容类型一样紧密地结合在一起text plain 默认值 The line height top margin CSS 属性似乎没有帮
  • PHP 如何将对象数组与数组数组合并

    首先 抱歉冗长的解释 我在 PHP 中有两个数组 第一个数组是对象数组 第二个数组是数组的数组 基本上 我想循环遍历并将对象与其匹配的数组合并 然后返回合并的对象 请参阅以下内容print r 对象结构数组 Array 0 gt stdCl
  • 在 Azure Blob 存储上上传大文件时“流太长”

    我尝试将大文件 4Gb 上传到 Azure Blob 存储 但失败 根据这篇文章 https learn microsoft com en us azure storage storage dotnet how to use blobs 这
  • Excel/VBA - 如果网络连接不存在则中止脚本

    是否有任何 VBA 代码可以查找当前的互联网连接 我有一个将在计时器上运行的代码 此代码将打开本地网络共享驱动器上的文件 我正在寻找某种类型的 On Error Goto ErrorMessage 代码 如果它在网络未连接时尝试打开文件 您
  • Marshal (Ruby) 管道:将序列化对象发送到子进程

    我需要使用 Marshal 序列化 Ruby 中的对象 并通过管道将其发送到子进程 我怎样才能做到这一点 我的代码如下所示 我的问题在评论中 data Marshal dump data call sub process ruby r a