如何隔离 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 中的方法 - 多处理问题的主要内容,如果未能解决你的问题,请参考以下文章