Tag: fork

在延迟工作中运行叉子

我们在Web应用程序中使用延迟作业,我们需要并行发生多个延迟作业的工作,但我们不知道需要多少工作。 解决方案我目前正在尝试运行一个worker并在所需任务中调用fork / Process.detach。 我之前试图直接在rails应用程序中运行fork,但它对乘客来说效果不好。 这个解决方案似乎运作良好。 生产中可能有任何警告吗?

Fork上的Fork,Ruby,ActiveRecord和File Descriptors

我理解当我们分叉一个进程时,子进程inheritance父类打开文件描述符和偏移的副本。 根据手册页,这指的是父母使用的相同文件描述符。 基于该理论在以下程序中 puts “Process #{Process.pid}” file = File.open(‘sample’, ‘w’) forked_pid = fork do sleep(10) puts “Writing to file now…” file.puts(“Hello World. #{Time.now}”) end file.puts(“Welcome to winter of my discontent #{Time.now}”) file.close file = nil 问题1:hibernate10秒的分叉进程不应该丢失其文件描述符,并且在父进程完成并关闭文件并退出时无法写入文件。 问题2:但无论出于何种原因,如果这都有效,那么ActiveRecord在这种情况下如何失去连接。 它只有在我设置时才有效:reconnect => true在ActiveRecord connect上:reconnect => true它是否可以实际连接,这意味着它失去连接。 require “rubygems” require “redis” require ‘active_record’ require ‘mysql2’ connection = ActiveRecord::Base.establish_connection({ :adapter […]

通过ruby进程共享变量

我正在写一个gem,我必须分叉两个进程,这两个进程启动两个webrick服务器。 我想通过基类中的类方法启动此服务器,因为应该只运行这两个服务器,而不是多个服务器。 在运行时,我想在这两个服务器上调用一些方法来更改变量。 我的问题是,我无法通过基类的类方法访问forks的实例变量。 此外,我不能在我的基类中使用线程,因为我在使用另一个非线程安全的库。 所以我必须将每个服务器分配给它自己的进程。 我用类变量尝试了它,比如@@server 。 但是当我尝试通过基类访问这些变量时,它是nil 。 我读过Ruby中不可能在forks中共享类变量,对吗? 那么,还有其他方法吗? 我想过使用单身,但我不确定这是不是最好的主意。

在ruby中一次读取N行文件

我有一个大文件(数百兆),由文件名组成,每行一个。 我需要循环遍历文件名列表,并为每个文件名分叉一个进程。 我希望一次最多8个分叉进程,我不想一次将整个文件名列表读入RAM。 我甚至不确定从哪里开始,任何人都可以帮助我吗?

Ruby 2.2中的垃圾收集器引发了意想不到的CoW

当我分叉我的进程时,如何防止GC激发写时复制? 我最近一直在分析垃圾收集器在Ruby中的行为,因为我在程序中遇到了一些内存问题(即使对于相当小的任务,我的60核0.5Tb机器上的内存耗尽)。 对我来说,这确实限制了ruby在多核服务器上运行程序的实用性。 我想在这里介绍我的实验和结果。 垃圾收集器在分叉期间运行时会出现问题。 我调查了三个案例来说明这个问题。 情况1:我们使用数组在内存中分配了大量对象(字符串不超过20个字节)。 字符串是使用随机数和字符串格式创建的。 当进程分叉并且我们强制GC在子进程中运行时,所有共享内存都是私有的,导致初始内存的重复。 情况2:我们使用数组在内存中分配了很多对象(字符串),但是使用rand.to_s函数创建了字符串,因此我们删除了与前一种情况相比的数据格式。 我们最终使用的内存量较少,可能是因为垃圾较少。 当进程分叉并且我们强制GC在子进程中运行时,只有部分内存变为私有。 我们有重复的初始内存,但程度较小。 情况3:与之前相比,我们分配的对象更少,但是对象更大,因此分配的内存量与之前的情况相同。 当进程分叉并且我们强制GC在子进程中运行时,所有内存保持共享,即没有内存重复。 在这里,我粘贴用于这些实验的Ruby代码。 要在不同情况之间切换,只需更改memory_object函数中的“option”值即可。 在Ubuntu 14.04机器上使用Ruby 2.2.2,2.2.1,2.1.3,2.1.5和1.9.3测试了代码。 案例1的示例输出: ruby version 2.2.2 proces pid log priv_dirty shared_dirty Parent 3897 post alloc 38 0 Parent 3897 4 fork 0 37 Child 3937 4 initial 0 37 Child 3937 8 empty GC 35 5 完全相同的代码是用Python编写的,在所有情况下,CoW都可以正常工作。 […]