오브젝트 풀은 어떤 객체를 생성하는데 자원이 굉장히 많이 필요하거나, 한정된 수의 인스턴스만 사용할 수 있을때 이넘들을 컬랙션에 집어넣고 관리할 수 있도록 해주는 패턴이라능. 물론 한번 만들어놓은 인스턴스를 계속 사용한다능
Socket, DB connection 등에 많이 쓴다는데...난 저런거랑은 별로 친하지가 않아서 잘 모르겠고....식당에있는 테이블을 생각해보면 된다능. 식당에는 딱 한정된 수의 자리만있는데 손님이 오면 빈자리를 내어준다능. 자리가 업ㅂ으면 빈자리가 생길 때 까지 기둘렸다 손님한태 자리를 내어주는데, 이 경우에 식당은 일종의 오브젝트 풀로 의자를 관리하구 있는거심.
require'thread'require'timeout'classObjectPoolError<StandardError;endclassObjectPoolFull<ObjectPoolError;endclassObjectPoolTimeOut<ObjectPoolFull;endclassObjectPoolConfigattr_accessor:pool_size,:timeoutdefinitialize(pool_size,timeout)@pool_size=pool_size@timeout=timeoutenddefinitialize(params)@pool_size=params[:pool_size]@timeout=params[:timeout]endendclassObjectPoolCreatordefcreateraiseObjectPoolError,"override this method"enddefvalid?(object)trueenddefexpireendendclassObjectPooldefinitialize(object_creator,config=nil)@object_creator=object_creatorraiseObjectPoolError,"First Parameter should be a kind of ObjectPoolCreator"if!@object_creator.kind_of?(ObjectPoolCreator)@config=configself_configurationif@config.nil?raiseObjectPoolError,"Second Parameter should be a kind of ObjectPoolConfig"if!@config.kind_of?(ObjectPoolConfig)@mutex=Mutex.new@cond=ConditionVariable.new@activations={}@idles=[]enddefborrow_object@mutex.synchronizedoresult=nilif@activations.size+@idles.size>=@config.pool_sizeraiseObjectPoolFull,"%s is full"%self.classif@config.timeout==0begintimeout(@config.timeout){@cond.wait(@mutex)}rescueTimeoutErrorraiseObjectPoolTimeOut,"%s borrow_object is timeout"%self.classendresult=@idles.popelsif!@idles.empty?result=@idles.popelseresult=create_objectendif!@object_creator.valid?(result)result.expireresult=create_objectend@activations.storeresult.__id__,resultreturnresultendenddefreturn_object(object)@mutex.synchronizedo@activations.deleteobject.__id__@idles<<object@cond.signalendendprivatedefself_configuration@config=ObjectPoolConfig.new(10, 1)enddefcreate_object@object_creator.createendend
풀에 담을 수 있는 인스턴스의 총 수를 결정할 수 있구 풀이 꽉찼을경우 대기 시간을 초단위로 설정할 수 있게 되있심. 풀에서 객체를 꺼내주기 직전에 유효성검증을 수행하고 실패할경우 뭉게버리고 다시 만들어 주도록 되있다능. 식당으로 비유하면 더러운 테이블을 깔끔히 닦아내고 손님한태 내어주는거랑 비슷하다고 보면 되겠심. 물론 하기 싫으면 안해도 된다능. >_<
댓글을 달아 주세요