将进程表示为Ruby中的线程

时间:2014-12-07 16:06:00

标签: ruby multithreading

我应该在ruby中实现一个非常简单的MPI版本(或者更确切地说是模拟行为)。 部分任务是创建一个具有的Communicator类 在不同主机上运行的不同进程。 为了证明进程的“独立性”,两个连续的for循环遍历存储进程的数组,应该以不同的顺序输出它们。

进程应表示为我编写的类的实例或线程。 对于第一部分,我刚刚创建了一个具有所需属性的类,并在每次调用后更改了“each”方法以对进程列表进行洗牌。

然而,我正在与第二部分打交道。现在我刚刚创建了Thread的子类并添加了必需的属性和方法。我只需根据需要在块中创建无限循环的子类实例,并将它们存储在数组中。 现在,在循环遍历数组时,进程似乎有不同的响应时间,但仍然按顺序写入控制台。

由于我对我的方法是否正确有疑问,我想就如何实现所需行为提出一些建议:

for process in communicator write rank

for process in communicator write rank
> 1
> 2
> 3
#####
> 3
> 1
> 2

编辑:

传播者:

class ThreadKomunikator


attr_reader :hosty, :procesy, :rankPool
@@rankPool = (0..100).to_a.reverse

public
def initialize(hosty)

    @procesy = []
    @hosty = hosty
    hosty.each do |name, number|
        for i in 1..number
            tempProc = ThreadProc.new{while true do continue; end;}
            tempProc.init(getRank(),name)
            procesy << tempProc
        end
    end
end

def MPI_Comm_size()
    procesy.length
end

def each
    procesy.each do |proces|
        yield proces
    end
#   #procesy.shuffle!
end

def [](x)
    procesy.each do |proces|
        if proces.rank == x
            return proces.MPI_Get_processor_name()
        end
    end
    return "No process of that rank found!"
end

def method_missing(method, *args, &block)
    if hosty.has_key?("#{method}")
        return hosty["#{method}"]
    else
        return 0
    end
end

private 
def getRank
    @@rankPool.pop
end



end

Thread的子类:

class ThreadProc< Thread
attr_accessor :rank, :host
def init(rank, host)
    @rank = rank
    @host = host
end


def MPI_Comm_rank()
    @rank
end

def MPI_Get_processor_name()
    @host
end

end

0 个答案:

没有答案