Ruby并行每个循环

Ruby并行每个循环,ruby,multithreading,parallel-processing,Ruby,Multithreading,Parallel Processing,我有以下代码的密码: FTP ... do |ftp| files.each do |file| ... ftp.put(file) sleep 1 end end 我希望以单独的线程或某种并行方式运行每个文件。正确的方法是什么?这是对的吗 这是我试穿的衣服 并行is puts/输出的问题可能同时发生,如下所示: as = [1,2,3,4,5,6,7,8] results = Parallel.map(as) do |a| puts a end 我怎样才能强

我有以下代码的密码:

FTP ... do |ftp| 
  files.each do |file| 
  ...
  ftp.put(file)
  sleep 1
  end 
end 
我希望以单独的线程或某种并行方式运行每个文件。正确的方法是什么?这是对的吗

这是我试穿的衣服

并行is puts/输出的问题可能同时发生,如下所示:

as = [1,2,3,4,5,6,7,8]
results = Parallel.map(as) do |a|
  puts a
end

我怎样才能强迫看跌期权像正常情况下的行间分隔一样发生呢

为了保持简单,下面是我对内置
线程
所做的:

results = files.map do |file|
  result = Thread.new do
    ftp.put(file)
  end
end

请注意,此代码假定
ftp.put(文件)
安全返回。如果不能保证这一点,您必须自己将调用包装在一个超时块中,并让每个线程在抛出异常时返回一个异常,然后在循环的最后进行阻塞检查,以确保
结果
不包含任何异常。

并行化的整个要点是同时运行。但是,如果流程的某个部分希望按顺序运行某些代码,则可以使用
互斥锁
如下所示:

semaphore = Mutex.new
as = [1,2,3,4,5,6,7,8]
results = Parallel.map(as, in_threads: 3) do |a|
  # Parallel stuff
  sleep rand
  semaphore.synchronize {
    # Sequential stuff
    puts a
  }
  # Parallel stuff
  sleep rand
end
您将看到它正确地打印内容,但不必按相同的顺序打印。我在线程
中使用了
,而不是在进程
中使用了
(默认设置),因为
互斥锁
不适用于进程。如果您确实需要流程,请参阅下面的备选方案

参考文献:


我通常使用,它使用SizedQueues,因此允许您在同一时间执行最大数量的并行作业(peach也这样做)。我只是尝试了一下外观,但不确定它是否正常工作。并行看起来不错,我不知道,谢谢
semaphore = Mutex.new
as = [1,2,3,4,5,6,7,8]
results = Parallel.map(as, in_threads: 3) do |a|
  # Parallel stuff
  sleep rand
  semaphore.synchronize {
    # Sequential stuff
    puts a
  }
  # Parallel stuff
  sleep rand
end