require 'ObjectPool'
require 'thread'
class ThreadPool
private
class WorkerCteator < ObjectPoolCreator
def create
Worker.new
end
end
class WorkerPool < ObjectPool
def initialize(creator, config)
super creator, config
end
end
class Worker
def initialize
@job = nil
@mutex = Mutex.new
@thread = Thread.new do
while true
if @job == nil
sleep 0.001
else
@mutex.synchronize { @job.call; @job = nil; }
end
end
end
end
def job=(job)
@mutex.synchronize { @job = job }
end
def free?
@job.nil?
end
end
public
def initialize(size)
@size = size
@timeout = 0
@workers = []
@pool = WorkerPool.new WorkerCteator.new, ObjectPoolConfig.new(:pool_size => @size, :timeout => @timeout)
@job_queue = Queue.new
@mutex = Mutex.new
@joined = false
@thread = Thread.new do
while true
release_worker
do_job
sleep 0.001 if free?
end
end
end
def process(&job)
@job_queue << job
end
def join
sleep 0.1 while !free?
end
def free?
res = nil
@mutex.synchronize { res = @workers.empty? }
res && @job_queue.empty?
end
private
def release_worker
free_workers = []
@mutex.synchronize do
@workers.each { |w| free_workers << w if w.free? }
@workers -= free_workers
end
free_workers.each { |w| @pool.return_object w }
end
def do_job
begin
worker = @pool.borrow_object
rescue ObjectPoolFull
return
end
begin
job = @job_queue.pop true
rescue
@pool.return_object worker
return
end
worker.job = job
@mutex.synchronize { @workers << worker }
end
end
댓글을 달아 주세요
디자인패턴,, 솔까말 배운지는 좀됫는데 써본건 거의없다능;;
고로 휘발성... ㅋㅋㅋ
잘지냄??
시절이 시절인지라...맘편히 지내지는 못하지만
밥은 먹고 다닌다능
잘쓰겠다능 ㅋㅋ
난 왜 결과가 다르지
GG 4
GG 2
GG 1
GG 3
GG 0
"Main Thread!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" x10
이러고 데드락 ㅠ
ruby 1.9.3p0 (2011-10-30) [i386-mingw32]
뭥미?!
1.9.3 깔고 해봤는데 잘되네 -_-;