如何隔离 Ruby 中的方法 - 多处理问题

Posted

技术标签:

【中文标题】如何隔离 Ruby 中的方法 - 多处理问题【英文标题】:How to isolate methods in Ruby - multiprocessing question 【发布时间】:2021-05-19 08:57:42 【问题描述】:

我有 3 种方法可以在文件系统上执行某些操作,但是每种方法都会更改当前目录,并且我不能对这些方法使用线程,因为它使用相同的 ruby​​ 进程并且我有竞速条件。我发现 Process.spawn(不能在 Windows 上使用 fork)可能是解决方案,但我不知道如何在每个进程中生成 3 个进程和调用方法。

我尝试了以下作为测试,但没有成功

#!/usr/bin/env ruby
def something
  puts 'printaj'
end

def nextsomething
  puts 'vici'
end


pid1 = Process.spawn(something)
pid2 = Process.spawn(nextsomething)
Process.wait pid1
Process.wait pid2
puts 'both finished'

【问题讨论】:

请参阅docsspawn 是如何定义的:它创建一个子进程,并将它作为参数传递给要执行的命令行。您还可以将参数传递给这个新进程,以告诉它究竟要执行什么。 是的,但我需要运行应该隔离的方法。所以我正在寻找一种方法来做到这一点。 Re,“...每个方法都会更改当前目录...”这很丑陋,而且原因不止一个。为什么不重新编写方法以便它们不需要更改进程的 CWD? @opti2k4 : 在进程中,你可以运行任何你想要的方法,并且进程中的方法总是与其他进程中的方法隔离执行。 我们的 ruby​​ 脚本用于从源代码构建解决方案。例如,我们有构建 Angular、构建 webpack 步骤(方法),它们都在源代码中自己的目录中工作。可以单独运行这些进程,但是使用线程我有竞速条件,因为它们没有被隔离,因此一种方法报告它缺少源文件,因为其他更改了源目录。 【参考方案1】:

线程和互斥锁怎么样?

semaphore = Mutex.new

a = Thread.new 
  semaphore.synchronize 
    # do something on the file system
  


b = Thread.new 
  semaphore.synchronize 
    # do something on the file system
  

使用此代码,您将只能在文件系统上同时运行一项操作。 https://ruby-doc.org/core-2.5.0/Mutex.html

【讨论】:

你确定吗?如果我在 chdir c:\, touch fileą, cat filea 和 b chir e:\, touch fileb, cat fileb 下,就不会出现竞速条件,并且来自 a won't repot not found 的线程?我尝试使用没有互斥锁的线程,但它不起作用,这是我的问题。 @sig :这是使用 threds,这当然是合理的,但不是 OP 要求的。他明确表示他不想使用线程,而是分离进程。这就是为什么他使用spawn 的方法基本上会做他想做的事,如果他只是正确地调用了这些函数的话。为这项任务设置单独的流程可能不是最好的主意,这是一个不同的问题。

以上是关于如何隔离 Ruby 中的方法 - 多处理问题的主要内容,如果未能解决你的问题,请参考以下文章

ruby 接口隔离失败

在 Ruby/Rails 中隔离数据访问层的最佳实践

如何在谷歌浏览器中禁用站点隔离?

K8s 实践 | 如何解决多租户集群的安全隔离问题?

K8s 实践 | 如何解决多租户集群的安全隔离问题?

K8s 实践 | 如何解决多租户集群的安全隔离问题?