Windows/Ruby后台处理

Windows/Ruby后台处理,ruby,windows,background,Ruby,Windows,Background,我有一个小应用程序,需要在后台运行一些任务。它的主要用途是打开一个套接字到另一台机器,通过套接字发送一个文件(可能有N台机器存在),并侦听另一个套接字上的响应。此任务可能需要30秒到几个小时,而机器此时正处于繁忙状态,无法处理任何新作业。理想情况下,我希望并行处理尽可能多的任务(=可用的非繁忙机器) 基本应用程序流程为: loop do # get available machines # fork a thread / background worker for each # pr

我有一个小应用程序,需要在后台运行一些任务。它的主要用途是打开一个套接字到另一台机器,通过套接字发送一个文件(可能有N台机器存在),并侦听另一个套接字上的响应。此任务可能需要30秒到几个小时,而机器此时正处于繁忙状态,无法处理任何新作业。理想情况下,我希望并行处理尽可能多的任务(=可用的非繁忙机器)

基本应用程序流程为:

loop do
  # get available machines
  # fork a thread / background worker for each
  # process a wating job job
end
有人能推荐一些简单的方法来满足在windows上运行的需求吗

谢谢!
Ben

只要您对“绿色”(非本机)线程没有问题,那么这个怎么样:

require 'thread'
job_lock = Mutex.new
kid_lock = Mutex.new

$o = Mutex.new
def o(msg)
  $o.synchronize{
    t = Time.now; puts "%02d:%06.3f %s" % [ t.min, t.to_f%60, msg]
  }
end

# Simulate jobs coming into a queue
current_chores = []
CHORES = [
  "mow the cat", "wash the lawn", "order pizza",
  "answer questions on s/o", "cover cat in soothing lotion",
  "rinse suds off lawn", "pay more attention"
]
Thread.new do
  loop do
    sleep rand*5+3
    job_lock.synchronize do
      unless CHORES.empty?
        current_chores << (j=CHORES.shift)
        o "New job in the queue: '#{j}'"
      end
    end
  end
end

# A simple queue of machines to use
free_kids = %w[ Jimmy Susan ]

# The meat
loop do
  until job = job_lock.synchronize{ current_chores.shift }
    o "Waiting for a job..."
    sleep 1 # Look for new jobs every second
  end
  until kid = kid_lock.synchronize{ free_kids.shift }
    o "Waiting for a free child to do my bidding..."
    sleep 2 # Look for new kids every 2 seconds
  end
  Thread.new do
    o "#{kid} is now performing '#{job}'"
    sleep rand*10+10 # Simulate long process
    o "#{kid} FINISHED '#{job}'"
    kid_lock.synchronize{ free_kids << kid }
  end
end

#=> 08:52.604 Waiting for a job...
#=> 08:53.604 Waiting for a job...
#=> 08:54.604 Waiting for a job...
#=> 08:55.604 Waiting for a job...
#=> 08:56.605 Waiting for a job...
#=> 08:57.327 New job in the queue: 'mow the cat'
#=> 08:57.605 Waiting for a job...
#=> 08:57.606 Jimmy is now performing 'mow the cat'
#=> 08:58.606 Waiting for a job...
#=> 08:59.606 Waiting for a job...
#=> 09:00.606 Waiting for a job...
#=> 09:01.606 Waiting for a job...
#=> 09:01.626 New job in the queue: 'wash the lawn'
#=> 09:02.606 Waiting for a job...
#=> 09:02.607 Susan is now performing 'wash the lawn'
#=> 09:03.607 Waiting for a job...
#=> 09:04.607 Waiting for a job...
#=> 09:05.607 Waiting for a job...
#=> 09:06.607 Waiting for a job...
#=> 09:07.431 New job in the queue: 'order pizza'
#=> 09:07.607 Waiting for a free child to do my bidding...
#=> 09:09.607 Waiting for a free child to do my bidding...
#=> 09:11.608 Waiting for a free child to do my bidding...
#=> 09:13.373 Jimmy FINISHED 'mow the cat'
#=> 09:13.609 Waiting for a job...
#=> 09:13.609 Jimmy is now performing 'order pizza'
#=> 09:13.930 New job in the queue: 'answer questions on s/o'
#=> 09:14.609 Waiting for a free child to do my bidding...
#=> 09:16.609 Waiting for a free child to do my bidding...
#=> 09:16.671 Susan FINISHED 'wash the lawn'
#=> 09:18.609 Waiting for a job...
#=> 09:18.610 Susan is now performing 'answer questions on s/o'
#=> 09:19.610 Waiting for a job...
#=> 09:19.878 New job in the queue: 'cover cat in soothing lotion'
#=> 09:20.611 Waiting for a free child to do my bidding...
#=> 09:22.611 Waiting for a free child to do my bidding...
#=> 09:24.196 New job in the queue: 'rinse suds off lawn'
#=> 09:24.611 Waiting for a free child to do my bidding...
#=> 09:26.612 Waiting for a free child to do my bidding...
#=> 09:28.612 Waiting for a free child to do my bidding...
#=> 09:28.677 New job in the queue: 'pay more attention'
#=> 09:29.878 Jimmy FINISHED 'order pizza'
#=> 09:30.263 Susan FINISHED 'answer questions on s/o'
#=> 09:30.613 Waiting for a free child to do my bidding...
#=> 09:30.614 Susan is now performing 'rinse suds off lawn'
#=> 09:30.615 Jimmy is now performing 'cover cat in soothing lotion'
#=> 09:32.614 Waiting for a free child to do my bidding...
#=> 09:34.614 Waiting for a free child to do my bidding...
#=> 09:36.614 Waiting for a free child to do my bidding...
#=> 09:38.614 Waiting for a free child to do my bidding...
#=> 09:40.614 Waiting for a free child to do my bidding...
#=> 09:42.614 Waiting for a free child to do my bidding...
#=> 09:42.764 Jimmy FINISHED 'cover cat in soothing lotion'
#=> 09:44.614 Waiting for a job...
#=> 09:44.615 Jimmy is now performing 'pay more attention'
#=> 09:45.615 Waiting for a job...
#=> 09:46.615 Waiting for a job...
#=> 09:47.615 Waiting for a job...
#=> 09:47.862 Susan FINISHED 'rinse suds off lawn'
#=> 09:48.615 Waiting for a job...
#=> 09:49.615 Waiting for a job...
#=> 09:50.615 Waiting for a job...
#=> 09:51.616 Waiting for a job...
#=> 09:52.617 Waiting for a job...
#=> 09:53.617 Waiting for a job...
#=> 09:54.618 Waiting for a job...
#=> 09:55.619 Waiting for a job...
#=> 09:56.619 Waiting for a job...
#=> 09:57.620 Waiting for a job...
#=> 09:58.620 Waiting for a job...
#=> 09:59.620 Waiting for a job...
#=> 10:00.531 Jimmy FINISHED 'pay more attention'
#=> 10:00.621 Waiting for a job...
需要“线程”
job\u lock=Mutex.new
kid_lock=Mutex.new
$o=互斥。新建
DEFO(味精)
$o.synchronize{
t=Time.now;放置“%02d:%06.3f%s”%[t.min,t.to_f%60,msg]
}
结束
#模拟进入队列的作业
当前的杂务=[]
家务活=[
“给猫割草”、“洗草坪”、“点比萨饼”,
“回答关于s/o的问题”,“用舒缓乳液覆盖猫”,
“冲洗草坪上的肥皂水”,“多加注意”
]
新做的
环道
睡眠兰德*5+3
job\u lock.do同步
除非是家务活。空的?
当前的杂务08:53.604等待工作。。。
#=>08:54.604正在等待作业。。。
#=>08:55.604正在等待作业。。。
#=>08:56.605正在等待作业。。。
#=>08:57.327队列中的新作业:“割猫”
#=>08:57.605正在等待作业。。。
#=>08:57.606吉米正在表演“割猫”
#=>08:58.606正在等待作业。。。
#=>08:59.606正在等待作业。。。
#=>09:00.606正在等待作业。。。
#=>09:01.606正在等待作业。。。
#=>09:01.626队列中的新作业:“清洗草坪”
#=>09:02.606正在等待作业。。。
#=>09:02.607苏珊正在表演“清洗草坪”
#=>09:03.607正在等待作业。。。
#=>09:04.607正在等待作业。。。
#=>09:05.607正在等待作业。。。
#=>09:06.607正在等待作业。。。
#=>09:07.431队列中的新作业:“订购比萨饼”
#=>09:07.607等待一个免费的孩子来执行我的命令。。。
#=>09:09.607等待一个免费的孩子来执行我的命令。。。
#=>09:11.608等待一个免费的孩子来执行我的命令。。。
#=>09:13.373吉米完成了《给猫割草》
#=>09:13.609正在等待作业。。。
#=>09:13.609吉米正在表演“订购比萨饼”
#=>09:13.930队列中的新作业:“回答s/o问题”
#=>09:14.609等待一个免费的孩子来执行我的命令。。。
#=>09:16.609等待一个免费的孩子来执行我的命令。。。
#=>09:16.671苏珊完成了《洗草坪》
#=>09:18.609正在等待作业。。。
#=>09:18.610 Susan现在正在执行“回答s/o上的问题”
#=>09:19.610正在等待作业。。。
#=>09:19.878队列中的新工作:“用舒缓乳液覆盖猫”
#=>09:20.611等待一个免费的孩子来执行我的命令。。。
#=>09:22.611等待一个免费的孩子来执行我的命令。。。
#=>09:24.196队列中的新作业:“冲洗草坪上的肥皂水”
#=>09:24.611等待一个免费的孩子来执行我的命令。。。
#=>09:26.612等待一个免费的孩子做我的命令。。。
#=>09:28.612等待一个免费的孩子来执行我的命令。。。
#=>09:28.677队列中的新作业:“注意”
#=>09:29.878吉米完成了“点比萨饼”
#=>09:30.263苏珊完成了“回答s/o问题”
#=>09:30.613等待一个免费的孩子做我的出价。。。
#=>09:30.614苏珊正在表演“冲洗草坪上的肥皂水”
#=>09:30.615吉米现在正在表演“用舒缓乳液盖住猫”
#=>09:32.614等待一个免费的孩子来执行我的命令。。。
#=>09:34.614等待一个免费的孩子做我的命令。。。
#=>09:36.614等待一个免费的孩子做我的命令。。。
#=>09:38.614等待一个免费的孩子来执行我的命令。。。
#=>09:40.614等待一个免费的孩子来执行我的命令。。。
#=>09:42.614等待一个免费的孩子来执行我的命令。。。
#=>09:42.764吉米完成了“用舒缓乳液覆盖猫”
#=>09:44.614正在等待作业。。。
#=>09:44.615吉米现在正在表演“多加注意”
#=>09:45.615等待工作。。。
#=>09:46.615等待工作。。。
#=>09:47.615等待工作。。。
#=>09:47.862苏珊完成了“冲洗草坪上的肥皂水”
#=>09:48.615等待工作。。。
#=>09:49.615等待工作。。。
#=>09:50.615等待工作。。。
#=>09:51.616正在等待作业。。。
#=>09:52.617正在等待作业。。。
#=>09:53.617正在等待作业。。。
#=>09:54.618正在等待作业。。。
#=>09:55.619正在等待作业。。。
#=>09:56.619正在等待作业。。。
#=>09:57.620正在等待工作。。。
#=>09:58.620正在等待工作。。。
#=>09:59.620正在等待工作。。。
#=>10:00.531吉米完成了“多加注意”
#=>10:00.621正在等待作业。。。

不管是什么药草让你冲洗草坪上的肥皂水。。。我想要它。