我想在两个Ruby进程之间传递一个对象的实例。具体来说,我想将Selenium WebDriver的实例从一个进程传递到另一个进程。我想这样做的原因是因为Ruby需要花费大量时间来创建这个对象,但是我希望它被其他进程使用。
我发现了一些似乎指向使用DRb的相关问题here和here,但我一直无法找到任何有用的示例或示例代码。
我应该使用除DRb以外的工具吗?有没有人有类似我可以复制的例子?
答案 0 :(得分:5)
看起来你将不得不使用DRb,尽管它的文档似乎缺乏。然而,有一篇有趣的文章here。您可能还想考虑购买Masatoshi Seki的dRuby Book,以更好地了解如何有效地实现这一目标。
调查你是不是在考虑同时访问,而只是想将对象从一个进程发送到另一个进程的另一个选项是使用YAML序列化(即以Ruby可以读取的方式编码)对象(对于人类可读文件)或Marshall(对于二进制编码文件)并使用管道发送它。在另一个已被删除的答案中提到了这一点。
请注意,这些解决方案中的任何一个都需要大量修改Selenium代码,因为您要操作的对象既不支持复制,也不支持本地同时访问。
答案 1 :(得分:1)
大多数队列或分布式进程都需要某种序列化才能正常工作。如果您想传递对象而不是消息,那么这将是您解决问题的一个限制因素。
我不知道你是否可以marshal一个WebDriver对象。如果你不能,那么DRb可能是你的分布式Ruby程序的一个很好的选择,因为它支持DRbObject引用无法编组的东西。 DRb documentation中提供了一些示例。
根据您真正想要做的事情,可能值得仔细研究remote bindings客户端/服务器的Remote WebDriver或Selenium的JSON Wire Protocol作为在进程之间传递对象的替代方法。
这些是否适用于您的具体情况将在很大程度上取决于您为什么要传递对象而不是简单地驱动远程服务器。如果它在很大程度上是构建对象需要多长时间的问题,那么序列化/反序列化周期在所有情况下都不一定会更快。
您可能想要重新访问为什么您的对象创建速度太慢。如果收集和处理数据的时间过长,您可以使用某种测试夹具或工厂来缩短时间,或者使用较小的固定数据集,或者使用针对速度优化的预序列化对象
您可能还会考虑是否确实需要真实数据或对象进行测试。在许多情况下,您可以通过存根方法或创建模拟对象来加速测试,这些对象将返回集成测试所需的值,而无需执行昂贵的计算或长时间运行操作。
在某些情况下,您需要驱动完整堆栈并对实际数据执行验收测试。即使这样,您也可以设计一组夹具数据,这些夹具数据将花费更少的时间或内存来处理。至少值得考虑一下。