æè¿ãdRubyããã¯-Rubyã«ããåæ£äžŠåã³ã³ãã¥ãŒãã£ã³ã°ïŒã©ã€ãã©ãªã®äœæè
èªèº«ãæžããæ¥æ¬èªã®æ¬ã®ç¿»èš³ïŒããªãªãŒã¹ãããŸããã ãã®èšäºã§ã¯ãDRbã©ã€ãã©ãªã«é¢ããæ¬ã®ç« ã®æŠèŠã説æããŸãã ãã®ãããã¯ãããã«è©³ããç¥ãããå Žåã¯
ãæ¬ã
賌å
¥ãŸãã¯
ããŠã³ããŒãã§ããŸã ã ãã®æçš¿ã§ã¯ã¹ã¬ããã®åæã«ã€ããŠããRindaã©ã€ãã©ãªã«ã€ããŠã説æããŸããã
è€æ°ã®ããã»ã¹ã§åäœããã·ã¹ãã ãäœæããŠãããšããŸãã ããšãã°ãããã¯ã°ã©ãŠã³ãã§é·æéå®è¡ãããã¿ã¹ã¯ãå®è¡ããWebãµãŒããŒããããŸãã ãŸãã¯ãããããã»ã¹ããå¥ã®ããã»ã¹ãžã®ããŒã¿ã®è»¢éã確å®ã«ãããããã調æŽããå¿
èŠããããŸãã ãã®ãããªç¶æ³ã§ã¯ãDRbã©ã€ãã©ãªãå¿
èŠã§ãã å®å
šã«Rubyã§èšè¿°ãããŠãããæšæºã©ã€ãã©ãªã«å«ãŸããŠãããããããã«äœæ¥ãéå§ã§ããŸãã æ¥ç¶ããã«ã¯ã
require 'drb'
æžãã ã
require 'drb'
DRbã©ã€ãã©ãªã®é·æã¯ãäž»ã«Rubyèšèªèªäœã®ãã€ãããºã ã«ãããŸãã
第äžã«ãæºå段éã§æå°éã®åŽåãè²»ããå Žåãããããã»ã¹ãŸãã¯å¥ã®ããã»ã¹ã§ãããããããšãªããªããžã§ã¯ãã®ããå Žæã§äœæ¥ããŸãã ã©ã€ãã©ãªã¯ããã¹ãŠã®æè¡çãªè©³çŽ°ãå®å
šã«é ããŠããŸãã
第äºã«ãã€ã³ã¿ãŒãã§ã€ã¹ãããŒãã³ãŒãããå¿
èŠã¯ãããŸããã rubyãªããžã§ã¯ãã¯ããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå€éšã«å
¬éã§ããŸãããã®æ¹æ³ã§ã¯ãã©ã¡ãã
Hash
ã
Queue
ãªã©ã®æšæºã¯ã©ã¹ã®ããããã®æ©èœã䜿çšããããä»»æã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ç¬èªã®ã¯ã©ã¹ãäœæãããã§ããŸãã ããã«ãå®è¡äžã«ã€ã³ã¿ãŒãã§ã€ã¹ãçŽæ¥å€æŽãããã
method_missing
ã䜿çšããŠ
method_missing
ãåŠçããããšãã§ããŸãã ãããŠãã¡ãããã¯ã©ã€ã¢ã³ãã眲åãŸãã¯åäœãå€æŽããã¡ãœãããåŒã³åºããªãå ŽåããµãŒããŒã€ã³ã¿ãŒãã§ã€ã¹ã®æŽæ°ã¯ã¯ã©ã€ã¢ã³ãã«ãŸã£ãã圱é¿ããŸããã ãããã£ãŠããµãŒããŒãšã¯ã©ã€ã¢ã³ãã¯å¯èœãªéãç¬ç«ããŠããŸãã
ãããŠæåŸã«ãã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒããè¿ããããªããžã§ã¯ãã®ã¯ã©ã¹ãç¥ãå¿
èŠãããããŸãããã¯ã©ã€ã¢ã³ãã¯ããã䜿çšããã«äœ¿çšã§ããŸãã ãããã£ãŠããµãŒããŒã¯å¿
èŠãªã ã詳现ãé衚瀺ã«ã§ããŸãã
ãããããã¡ãããèœãšãç©Žãããããããã¯ãããããããŸãã 幞ããdRubyã®ç解ã¯ç°¡åã§ããããã®æ§é ãç解ããããšã§ãã»ãšãã©ã®åé¡ãç°¡åã«é²ãããšãã§ããŸãã æ®å¿µãªããããã®ã©ã€ãã©ãªã®ããã¥ã¡ã³ãã§ã¯å€ãã®ç¹ãæ確ã«ãããŠããªãããããã®èšäºã¯åå¿è
ãšæ¢ã«ã©ã€ãã©ãªã䜿çšããããšããã人ã«ãšã£ãŠèå³æ·±ããã®ã«ãªããŸãã
ãã¹ãŠãæ©èœããããšã確èªããã«ã¯ã2ã€ã®irb端æ«ãéããŸãã ã«ããŒ1.8ã®éããã©ãã»ã©å€§ãããããããªãã®ã§ãããŒãžã§ã³1.9ã«ã€ããŠè°è«ããŠããããšã«åæããŸãããïŒç¹ã«1.8以é-ããã«ãµããŒããçµäºããŸãïŒ
æ¡ä»¶ä»ãã§ãããã2ã€ã®ç«¯æ«ã¯ãµãŒããŒãšã¯ã©ã€ã¢ã³ãã§ãã ãµãŒããŒã¯ããªã¯ãšã¹ããåä¿¡ããããã³ããªããžã§ã¯ããæäŸããå¿
èŠããããŸãã ãã®ãªããžã§ã¯ãã«ã¯ãçµã¿èŸŒã¿åã®ãªããžã§ã¯ããç¹å¥ã«äœæãããã€ã³ã¿ãŒãã§ã€ã¹ãæã€ã¢ãžã¥ãŒã«ãªã©ãä»»æã®ãªããžã§ã¯ããæå®ã§ããŸãã 次ã«ãã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒã«æ¥ç¶ãããã®ãªããžã§ã¯ããšå¯Ÿè©±ããŸãã
ããšãã°ãæåã®ç«¯æ«ã§ãµãŒããŒãèµ·åããéåžžã®é
åãé
眮ããŸãããã
require 'drb' front = [] DRb.start_service('druby://localhost:1234', front) front << 'first'
ã¯ã©ã€ã¢ã³ããæ¥ç¶ããŸãã é
åã®æåã®èŠçŽ ãèªèããå¥ã®èŠçŽ ãé
åã«æžã蟌ã¿ãŸã
require 'drb' DRb.start_service remote_obj = DRbObject.new_with_uri('druby://localhost:1234') p remote_obj p remote_obj[0] remote_obj << 'second'
ããã§ãæåã®ç«¯æ«ãã
front[1]
åŒã³åºããŠãæåå
'second'
ãŸãã ãŸããå¥ã®ã¯ã©ã€ã¢ã³ããæ¥ç¶ããããããåãæ£é¢ãªããžã§ã¯ããæäœããããšãã§ããŸãã
æ¢ã«
DRb.start_service
ã«ããµãŒããŒã¯
DRb.start_service
ã³ãã³ãã«ãã£ãŠèµ·åãããŸãïŒã¬ãžã¹ã¿ã«æ³šæããŠãã ããïŒïŒã ãã®ã¡ãœããã¯ãåŒæ°ãšããŠ
'druby://hostname:port'
ãšãã圢åŒ
'druby://hostname:port'
ã¢ãã¬ã¹ãšããã³ããšã³ããªããžã§ã¯ããæã€æååãåããŸãã ããã³ããšã³ããªããžã§ã¯ãã¯ããªã¯ãšã¹ããåä¿¡ãããªããžã§ã¯ãã§ãã
ãµãŒããŒãå¥ã®ã¹ã¯ãªããã§èµ·åããããã¹ã¯ãªããã®æåŸã«
DRb.thread.join
ãèšè¿°ããŸãã å®éãDRbãµãŒããŒã¯å¥ã®ã¹ã¬ããã§èµ·åãããã¡ã€ã³ã¹ã¬ãããå®äºãããšããã«Rubyãããã°ã©ã ãã·ã£ããããŠã³ããŸãã ãããã£ãŠãã¡ã€ã³ã¹ã¬ãããDRbãµãŒããŒã¹ããªãŒã ã®ã¯ããŒãºãåŸ
ããªãå Žåãäž¡æ¹ã®ã¹ããªãŒã ãã¹ã±ãžã¥ãŒã«ããæ©ãå®äºãããµãŒããŒã¯ããã«å©çšã§ããªããªããŸãã
DRb.Thread.join
ã¡ãœãããå®è¡ãããšããµãŒããŒã®é»æºãåãããŸã§çŸåšã®ã¹ã¬ããããããã¯ããããšããäºå®ã«åããŠãã ããã
ãµãŒããŒã«æ¥ç¶ããã«ã¯ã
DRbObject.new_with_uri
ã¡ãœãããåŒã³åºãããµãŒããŒãèµ·åããã¢ãã¬ã¹ãåŒæ°ãšããŠæž¡ãå¿
èŠããããŸãã ãã®ã¡ãœããã¯ã
remote_obj
ãããã·ãªããžã§ã¯ããè¿ããŸãã ãããã·ãªããžã§ã¯ããžã®ãªã¯ãšã¹ãïŒã¡ãœããåŒã³åºãïŒã¯ããªã¢ãŒããµãŒããŒäžã®ãªããžã§ã¯ãã«èªåçã«è»¢éãããåŒã³åºãããã¡ãœãããããã§å®è¡ãããåŸãã¡ãœãããåŒã³åºããŠããã¯ã©ã€ã¢ã³ãã«çµæãè¿ãããŸãã ïŒãã ãããã¹ãŠã®ã¡ãœããããµãŒããŒã§åŒã³åºãããããã§ã¯ãããŸãããããšãã°ãåäœã«ãã£ãŠå€æãããšã
#class
ã¡ãœãã
#class
ããŒã«ã«
#class
å®è¡ãããŸãïŒ
ã¯ã©ã€ã¢ã³ãã¯ã
DRb.start_service
ã³ãã³ãã®æå³
DRb.start_service
å°ãåŸã§èª¬æããŸãã
æåŸã«ããªã¢ãŒããªããžã§ã¯ãã®ã¡ãœãããã©ã®ããã«å®è¡ãããããç解ããŸãããã ãããè¡ãã«ã¯ããããã·ãªããžã§ã¯ãã®ã¡ãœãããåŒã³åºããšãã¡ãœããã®ååãšåŒæ°ã®ãªã¹ããã·ãªã¢ã«åïŒããŒã·ã£ãªã³ã°ïŒãããTCPãããã³ã«ã䜿çšããŠçµæã®æååããµãŒããŒã«è»¢éãããŸãããµãŒããŒã¯åŒã³åºãåŒæ°ãéã·ãªã¢ã«åããããã³ããšã³ããªããžã§ã¯ãã§ã¡ãœãããå®è¡ããçµæãã·ãªã¢ã«åããŠã¯ã©ã€ã¢ã³ãã«è¿ããŸãã ãã¹ãŠãã·ã³ãã«ã«èŠããŸãã å®éãéåžžã®ãªã¢ãŒããªããžã§ã¯ããšåãæ¹æ³ã§ãªã¢ãŒããªããžã§ã¯ããæäœããã¡ãœããããããã·ãªããžã§ã¯ããããã³ãµãŒããŒã®ãªã¢ãŒãå®è¡ã®ããã®å€ãã®ã¢ã¯ã·ã§ã³ãé衚瀺ã«ãªããŸãã
ããããããã»ã©åçŽã§ã¯ãããŸããã ãªã¢ãŒãã¡ãœããã®åŒã³åºãã¯é«äŸ¡ã§ãã ãµãŒããŒäžã®ã¡ãœãããå€ãã®åŒæ°ã¡ãœãããããã«ãããããšãæ³åããŠãã ããã ããã¯ããµãŒããŒãšã¯ã©ã€ã¢ã³ããèšç®ãè¡ã代ããã«ãæéã®å€§éšåãæ¯èŒçé
ããããã³ã«ã䜿çšããŠäºãã«ã¢ã¯ã»ã¹ããããšãæå³ããŸãïŒ2ã€ã®ããã»ã¹ãåããã·ã³ã«é
眮ãããŠãããšäŸ¿å©ã§ãïŒã ãããé²ãããã«ãããã»ã¹éã®åŒæ°ãšçµæã¯åç
§ã§ã¯ãªãå€ã§æž¡ãããŸãïŒãªããžã§ã¯ãã®ããŒã·ã£ã©ã€ãŒãŒã·ã§ã³ã¯ãªããžã§ã¯ãã®å
éšç¶æ
ã®ã¿ãæ ŒçŽãããã®
object_id
èªèããŸãã-ãããã£ãŠããªããžã§ã¯ãã¯æåã«ã·ãªã¢ã«åããããã®åŸãéã·ãªã¢ã«åã¯å
ã®ãªããžã§ã¯ãã®ã³ããŒã«ãªããŸããåããªããžã§ã¯ãã«ãããã®ã§ã¯ãªãããã転éã¯ã³ããŒã«ãã£ãŠèªåçã«è¡ãããŸãïŒã Rubyã§ã¯éåžžããã¹ãŠãåç
§ã«ãã£ãŠæž¡ãããdRubyã§ã¯éåžžã¯å€ã«ãã£ãŠæž¡ãããŸãã ãããã£ãŠã
front[0].upcase!
ãå®è¡ãããš ãµãŒããŒã§ã¯ã
front[0]
å€ãå€æŽããã
remote_obj[0].upcase!
ãå®è¡ãããš ãæåã®èŠçŽ ã倧æåã§ååŸããŸããã
remote_obj.[](0)
ã¯æåã®èŠçŽ ã®ã³ããŒã§ããããããµãŒããŒäžã®å€ã¯å€æŽãããŸããã ãã®åŒã³åºãã¯ã
front[0].dup.upcase!
ãšåæ§ãšèŠãªãããšãã§ããŸã
front[0].dup.upcase!
ãã ããåŒæ°ãšçµæãåç
§ã§æž¡ããããªæ¹æ³ã§dRubyã®åäœããã€ã§ãå®çŸ©ã§ããŸãããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã
ä»ãããæåã®åé¡ã«ã€ããŠè©±ãåããšãã§ãã ãã¹ãŠã®ãªããžã§ã¯ããæŽååãããããã§ã¯ãããŸããã ããšãã°ãProcããã³IOãªããžã§ã¯ããããã³ã¹ã¬ããïŒã¹ã¬ãããªããžã§ã¯ãïŒã¯ãã³ããŒãä»ããŠããŒã·ã£ãªã³ã°ããã³éä¿¡ã§ããŸããã ãã®å Žåã®dRubyã¯æ¬¡ã®ããã«é²ã¿ãŸããããŒã·ã£ã©ã€ãŒãŒã·ã§ã³ãæ©èœããªãã£ãå Žåããªããžã§ã¯ãã¯åç
§æž¡ããããŸãã
ã§ã¯ããªããžã§ã¯ãã¯ã©ã®ããã«åç
§æž¡ããããŸããïŒ CãæãåºããŠãã ããã ããã§ã¯ããã€ã³ã¿ãŒããã®ç®çã«äœ¿çšãããŸãã Rubyã§ã¯ããã€ã³ã¿ãŒã®åœ¹å²ã¯
object_id
ã«ãã£ãŠå®è¡ãããŸãã ãªããžã§ã¯ããåç
§æž¡ãããã«ã¯ã
DRbObject
ã¯ã©ã¹ã®ãªããžã§ã¯ãã
DRbObject
ãŸãã
å®éã
DRbObject
ã¯åç
§æž¡ãã®ãããã·ãªããžã§ã¯ãã§ãã ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹
DRbObject.new(my_obj)
ã«
object_id
ãªããžã§ã¯ã
my_obj
object_id
ãªããžã§ã¯ãã®
my_obj
ã®ãµãŒããŒã®URIãå«ãŸããŠããŸãã ããã«ãããã¡ãœããåŒã³åºããã€ã³ã¿ãŒã»ããããŠãã¡ãœãããæå³ããããªã¢ãŒããã·ã³ïŒãŸãã¯å¥ã®ç«¯æ«ïŒäžã®ãªããžã§ã¯ãã«æž¡ãããšãã§ããŸãã
ãµãŒããŒãã¡ãœããã«ããŸããã
def front.[](ind) DRbObject.new(super) end
ãããŠãã¯ã©ã€ã¢ã³ãããã³ãŒããå®è¡ããŸãã
remote_obj.[0].upcase!
æ°ããã¡ãœãã
#[]
ã¯ãæåã®èŠçŽ ã®ã³ããŒã§ã¯ãªãããªã³ã¯ãè¿ããŸããããã®ããã
upcase!
ã¡ãœãããå®è¡ããåŸã«
upcase!
ããã³ããªããžã§ã¯ããå€æŽãããå Žåãããã¯ãããšãã°ã¯ã©ã€ã¢ã³ããšãµãŒããŒãããããã
puts remote_obj
ãŸãã¯
puts front
ã³ãã³ããå®è¡ããããšã§ç°¡åã«ç¢ºèªã§ããŸãã
ãããã
DRbObject.new
ãæžã
DRbObject.new
-æ
DRbObject.new
ã§ãã 幞ããªããšã«ãå€ã§ã¯ãªãåç
§ã«ãã£ãŠãªããžã§ã¯ããæž¡ãå¥ã®æ¹æ³ããããŸãã ãããè¡ãã«ã¯ããªããžã§ã¯ããéæŽååå¯èœã«ããã°ååã§ãã ããã¯ç°¡åã§ããªããžã§ã¯ãã«
DRbUndumped
ã¢ãžã¥ãŒã«ãå«ããã ãã§ãã
my_obj.extend DRbUndumped class Foo; include DRbUndumped; end
ããã§ããªããžã§ã¯ã
my_obj
ãš
Foo
ã¯ã©ã¹ã®ãã¹ãŠã®ãªããžã§ã¯ããåç
§ã«ãã£ãŠèªåçã«æž¡ãããŸãïŒãããŠ
Marshal.dump(my_obj)
ã¯
TypeError 'can\'t dump'
ã
TypeError 'can\'t dump'
ãŸãïŒã
å®éã«åºäŒã£ãäŸãæããŸãããã ãµãŒããŒã¯ããã·ã¥ãããã³ããªããžã§ã¯ããšããŠèšå®ããŸãããã®å Žåãå€ã¯ãã±ããã§ãïŒãã±ããå
ããã¯ã¹ããŒããã·ã³ã§ãïŒã 次ã«ã
remote_obj[ticket_id]
ã¯ãã±ããã®ã³ããŒãæäŸããŸãã ãã ããããã«ãããµãŒããŒäžã®ãã±ããã¹ããŒã¿ã¹ãå€æŽããããšã¯ã§ãããããŒã«ã«ã§ã®ã¿å€æŽã§ããŸãã
Ticket
ã¯ã©ã¹ã«
DRbUndumped
ãååŸããŸãããã ããã§ãããã·ã¥ãããã±ããã®ã³ããŒã§ã¯ãªãããã±ãããžã®ãªã³ã¯ãåŸãããŸãããããŠãããã«å¯Ÿããã¢ã¯ã·ã§ã³ã¯ãã¯ã©ã€ã¢ã³ãäžã§ã¯ãªããµãŒããŒäžã§çŽæ¥çºçããŸãã
ãããŠä»ãçŽæãæãåºããŠãã¯ã©ã€ã¢ã³ãã§
DRb.start_service
ãåŒã³åºãå¿
èŠãããçç±ãæããŠãã ããã æåã®äŸã®ããã«ããµãŒããŒäžã®ããã³ããªããžã§ã¯ãã«ãã£ãŠé
åã瀺ãããããšãæ³åããŠãã ããã
ããã§ãã¯ã©ã€ã¢ã³ãã
remote_obj.map{|x| x.upcase}
ã¡ãœãããåŒã³åºããŸã
remote_obj.map{|x| x.upcase}
remote_obj.map{|x| x.upcase}
å®éããããã¯åŒæ°ãæã€mapã¡ãœããã¯ãããã³ããªããžã§ã¯ãã§åŒã³åºãããŸãã ãããŠãç§ãã¡ãæãåºãããã«ãç§ãã¡ã¯ããŒã·ã£ãªã³ã°ã§ããŸããã ãããã£ãŠããã®ãããã¯åŒæ°ã¯åç
§æž¡ããããŸãã ãµãŒããŒäžã®
map
ã¡ãœããã¯
yield
ã§ã¢ã¯ã»ã¹ããŸããããã¯ãã¯ã©ã€ã¢ã³ãããµãŒããŒã§ããããšãæå³ããŸãïŒ ãã ããã¯ã©ã€ã¢ã³ãã¯æã
ãµãŒããŒã§ããå¿
èŠãããããã
start_service
ã¡ãœããã䜿çšããŠDRbãµãŒããŒãèµ·åããå¿
èŠããããŸãã ãã®ãµãŒããŒã®URIãæå®ããå¿
èŠã¯ãããŸããã å
éšããã©ã®ããã«æ©èœããããç§ã«ã¯ããããŸããããæ©èœããŸãã ãããŠããã§ã«ãæ°ä»ãã®ããã«ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®éãã¯èŠãç®ãããå°ããã§ãã
æ°ããè¿·æã«ã€ãŸãããªã¹ã¯ããããŸãã ã¡ãœããããã¡ãœããã§çŽæ¥çæããããªããžã§ã¯ããžã®ãªã³ã¯ïŒã³ããŒã§ã¯ãªãïŒãè¿ãããšããŸãã ãµãŒããŒããã®ãªããžã§ã¯ããå¥ã®å Žæã«åå¥ã«ä¿åããªãã£ãå ŽåïŒããšãã°ãç¹å¥ãªããã·ã¥ã«å
¥ããªãã£ãå ŽåïŒããµãŒããŒãžã®ãªã³ã¯ã¯ãããŸããã ãªã¢ãŒããã·ã³äžã®ã¯ã©ã€ã¢ã³ãã¯æã£ãŠããŸããããµãŒããŒã¯æã£ãŠããŸããïŒ ãããã£ãŠãé
ããæ©ããããã®ãªããžã§ã¯ãã®
ã¡ãŒã«ã®ããã«
ãããŒã«ãããªãã®ãšããã«æ¥ãŸããGC-ã¬ããŒãžã³ã¬ã¯ã¿ãŒã§ãã ããã¯ããã°ãããããšãã¯ã©ã€ã¢ã³ãã®
DRbObject
ãããªãªã³ã¯ããäžè¯ãã«ãªããã©ãã«ããªã³ã¯ãããªãããšãæå³ããŸãã ãã®ãªããžã§ã¯ãã®ã¡ãœããã«ã¢ã¯ã»ã¹ããããšãããšããšã©ãŒãçºçããŸãã
ãããã£ãŠãå°ãªããšããµãŒããŒã«ãã£ãŠäœ¿çšããããŸã§ãè¿ããããªããžã§ã¯ããžã®ãªã³ã¯ããµãŒããŒãä¿ç®¡ããããã«æ³šæããå¿
èŠããããŸãã ããã«ã¯ããã€ãã®è§£æ±ºçããããŸãã
1ïŒåç
§ã«ãã£ãŠæž¡ããããã¹ãŠã®è¿ããããªããžã§ã¯ããé
åã«ä¿åããŸã-ãªã³ã¯ã䜿çšããããããã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ããããåéããŸããã
2ïŒã¯ã©ã€ã¢ã³ãã«ãããã¯ãžã®ãªã³ã¯ãéä¿¡ããŸãã äŸïŒ
ãã®ã³ãŒãã®ä»£ããã«ïŒ
Ticket.send :include, DRbUndumped def front.get_ticket Ticket.new end foo = remote_obj.get_ticket foo.start foo.closed?
次ã®ããã«æžããªããã°ãªããŸããïŒ
Ticket.send :include, DRbUndumped def front.get_ticket object_to_reference = Ticket.new yield object_to_reference end remote_obj.get_ticket do |foo| foo.start foo.closed? end
ãµãŒããŒäžã®æå¹ãªããŒã«ã«å€æ°ã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠåéã§ããŸããã ãããã£ãŠããããã¯å
ã§ã¯ããªã³ã¯ãæ©èœããããšãä¿èšŒãããŠããŸãã
3ïŒãã®æ¬ã¯å¥ã®æ¹æ³ã説æããŠããŸã-ãªããžã§ã¯ãã®
object_id
åãåã段éã§ãªã³ã¯ãäœæããããã»ã¹ã«
object_id
ãã®æç¹ã§ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããã»ã¹ãäœããã®æ¹æ³ã§é
ãããå¿
èŠããããŸãã ããã·ã¥ã«èŠçŽ ãèªåçã«è¿œå ãããªããžã§ã¯ããæ°žä¹
ã«ä¿åããããšãã§ããŸãïŒæšæž¬ã§ããããã«ãã¡ã¢ãªã¯é
ããæ©ãã䜿ãæããããã§ãããïŒããªããžã§ã¯ããžã®ãªã³ã¯ãä¿åããŠæåã§ã¯ãªã¢ã§ããŸãããã®ããã·ã¥ã¯æ°åããšã«ã¯ãªã¢ã§ããŸãã
æåŸã®ã¡ãœããã¯ã次ã®ããã«ããŠå®è£
ã§ããŸãã
require 'drb/timeridconv' DRb.install_id_conv(DRb::TimerIdConv.new)
ãµãŒããŒãèµ·åããåã«ã 詳现ã«ã€ããŠã¯ãæ¬ã®ç¬¬11ç« -ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®åŠçãåç
§ããŠãã ããã ç§ã«ã¯èå³æ·±ãããã§ãããããããããèªãã åŸãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããã»ã¹ã®æäœã䜿çšããæ°ããæ¹æ³ãèŠã€ããã§ãããã ããã§ããå®éã«ã¯2çªç®ã®æ¹æ³ã䜿çšããŠããããã¯ãžã®ãªã³ã¯ãäžããæ¹ãè¯ããšæããŸãã ããä¿¡é Œæ§ãé«ãç解ããããã
ããããæåŸã®ç¬éãç
§ããããã«æ®ã£ãŠããŸãã
Foo
ãªããžã§ã¯ãããªã³ã¯ãšããŠæž¡ããšä»®å®ããŸãã ã¯ã©ã€ã¢ã³ãã¯
Foo
ã¯ã©ã¹ã«ã€ããŠã¯ç¥ããŸããããããã§ããªããžã§ã¯ãã§ã®åäœã劚ããããšã¯ãããŸããã åºæ¬çã«ãã¯ã©ã€ã¢ã³ãã¯
DRbObject
ã¯ã©ã¹ã®ãªããžã§ã¯ããæäœããŸãã ãã¹ãŠããã€ãéãã§ãã
ããã§ããªã³ã¯ã§ã¯ãªãã³ããŒãéä¿¡ããŠãããšæ³åããŠãã ããã ãµãŒããŒã§ã®ã·ãªã¢ã«åã«ããããªããžã§ã¯ãã®ç¶æ
ãšãã®ã¯ã©ã¹ã®ååãä¿åãããŸããã ã¯ã©ã€ã¢ã³ãã¯æååãåä¿¡ããããããã·ãªã¢ã©ã€ãºããããšããŠããŸãã ãã¡ãããã¯ã©ã€ã¢ã³ãã¯ååšããªãã¯ã©ã¹
Foo
ãªããžã§ã¯ããäœæã§ããªããããããã¯åœŒã«ã¯æ©èœããŸããã 次ã«ãéã·ãªã¢ã«å
DRb::DRbUnknown
ã
DRb::DRbUnknown
åã®ãªããžã§ã¯ããè¿ãããããŒã·ã£ãªã³ã°ããããªããžã§ã¯ããšå
±ã«ãããã¡ãŒãæ ŒçŽãããŸãã ãã®ãªããžã§ã¯ãã¯ïŒããšãã°ãã¿ã¹ã¯ãã¥ãŒã«ïŒæž¡ãããšãã§ããŸãã ãŸããã¯ã©ã¹ã®ååã確èªããé©åãªã©ã€ãã©ãªãã¯ã©ã¹ã«ããŒãããŠã
reload
ã¡ãœãããåŒã³åºãããšãã§ããŸãããã®åŸãéã·ãªã¢ã«åãå床詊è¡ãããŸãã ããã¯
ãããããŸã ãããæåŸã®ç¬éã§ã¯ãããŸããã åæã«ã€ããŠã¯æžããªãããšãçŽæããŸããããããã§ãããã€ãèšèãè¿°ã¹ãŸãã
åæ£ããã°ã©ãã³ã°ã®å Žåãã¢ã¯ã·ã§ã³ã®åæãšæäœã®ååæ§ã¯éèŠãªæŠå¿µã§ãã ãµãŒããŒã¯å¥ã®ã¹ã¬ããã§èµ·åããŸãã ãµãŒããŒãžã®ãªã¯ãšã¹ãããšã«ããã®ãªã¯ãšã¹ããåŠçãããåå¥ã®ã¹ããªãŒã ãèªåçã«äœæãããŸãã ãããã£ãŠãç°ãªãã¹ã¬ãããåãæ
å ±ã«åæã«ã¢ã¯ã»ã¹ããããšãçŠæ¢ããå¿
èŠããããŸãã ãã®ãããåæ£ã·ã¹ãã ããã³äžŠåã·ã¹ãã ãããã°ã©ãã³ã°ããå Žåã¯ã次ã䜿çšããŸãã
1ïŒæ§ç¯
lock = Mutex.new; lock.synchronize{ do_smth }
lock = Mutex.new; lock.synchronize{ do_smth }
2ïŒæšæº
MonitorMixin
ã©ã€ãã©ãªã®ã¢ãžã¥ãŒã«
3ïŒæšæºã©ã€ãã©ãªã¯ã©ã¹ã®
Queue
ã
SizedQueue
DRbã䜿çšããŠé 匵ã£ãŠãã ããïŒ ç Žå£çãªæ¹æ³ã䜿çšããŠããã«ããããããããªããžã§ã¯ããå€æŽãããªãçç±ããããã¯ãåãå
¥ããæ¹æ³ãã¯ã©ã€ã¢ã³ãã§æ©èœãããæ¹æ³ãåä¿¡ãããªã³ã¯ãæ©èœãåäœããçç±ãç解ããããšããŠã誰ããé·ãæéãè²»ãããªãããã«é¡ã£ãŠããŸãã
ãã ãããã®æ¬ã§ã¯ãç¹ã«Rindaã©ã€ãã©ãªãšãã®åçç©ã«ã€ããŠãããã«å€ããèŠã€ããããšãã§ããŸãã