�@�O�y�[�W�܂łŁAThread�N���X��p�����X���b�h�̐����Ƃ��̗��p���@�̊�{���w�т܂����B�����ł́A������u�y�ʃX���b�h�v�ƌĂ��AFiber�N���X�ɂ��Č��Ă����܂��傤�B
�@Fiber�N���X���g���ƁAThread�N���X�̂悤�ɃX���b�h�������ł���̂ł����A������͏����ѐF���Ⴂ�܂��BFiber�N���X�ł�Thread�N���X�ƈႢ�AFiber�I�u�W�F�N�g�������e�̃R���e�L�X�g�ƁAFiber�I�u�W�F�N�g���ł̎q�R���e�L�X�g�̊Ԃ��A�����I�Ɍ݂��ɍs�����藈���肷�邱�Ƃ��ł��܂��B
�@���t�ł͓`���Â炢�̂ŁAfiber01.rb�ɗ��p��������܂��傤�B
g = Fiber.new do |x| loop { Fiber.yield(x); x += 1 } end 5.times { puts g.resume(0) }
$ ruby fiber01.rb 0 1 2 3 4
�@�ł́A�����̗����ǂ��܂��傤�B�܂�1�s�ڂŁuFiber.new�v�ɂ����Fiber�I�u�W�F�N�g�����A�ϐ�g�ɑ�����Ă��܂��B�t�@�C�o�[�̒��Ŏ��s���鏈���́A`Fiber.new`�Ƀu���b�N�Ƃ��ēn���܂��B
�@2�s�ڂ��t�@�C�o�[�̒��Ŏ��s���鏈���̖{�̂ł��B�����ł́Aloop���g���āA�uFiber.yield(x)�v�����s�����̂��Ax��1�𑫂����ޏ��������[�v�Ƃ��ċL�q���Ă��܂��B���́A����yield���t�@�C�o�[�̓����𗝉����錮�ƂȂ�܂��B
�@5�s�ڂł́A�t�@�C�o�[�ug�v�́uresume�v���\�b�h�Ɉ�����0��^���ăt�@�C�o�[�����s���Ă��܂��B�t�@�C�o�[�̓X���b�h�ƈقȂ�A�����I�Ɂuresume�v�ɂ���ē������Ȃ�����A�������Ƃ͂���܂���B
�@�uresume�v���\�b�h�ɗ^����ꂽ0�̓t�@�C�o�[�̃u���b�N�ϐ��ux�v�Ɋi�[����A2�s�ڂɏ������ڂ�܂��B�t�@�C�o�[���ŁuFiber.yield�v���\�b�h�����s�����ƁA�uyield�v�ɗ^����������Ԃ�l�Ƃ��ĕԂ��āA�t�@�C�o�[���ł̎��s�͈ꎞ�I�Ɏ~�܂�܂��B�܂�A2�s�ڂ́uFiber.yield(x)�v�ɏo��������_�ŁA5�s�ڂł�1��ڂ̃��[�v�ł�0���o�͂��Ď��̃��[�v�Ɉڍs���܂��B
�@5�s�ڂ�2��ڂ̃��[�v�ōĂсuresume�v���\�b�h�����s�����ƁA�t�@�C�o�[�ug�v�͏������ĊJ���ux += 1�v�����s����ĕϐ��ux�v�̒��g��1�ɂȂ�܂��B���̂��ƁA2�s�ڂ�loop�ɂ���Ĉ͂܂�Ă���̂ŁA�ĂсuFiber.yield(x)�v�����s����A5�s�ڂɏ������߂�A1���o�͂���܂��B���̂悤�ȓ�����J��Ԃ����ƂŁA0����4�̐�������������܂��B
�@���̍l�����́A��ʓI�Ɂu�W�F�l���[�^�[�v�ƌĂ�A���̖��̒ʂ�A���������̃f�[�^�������悤�Ȃ��̂ł��B�W�F�l���[�^�[�̒��̐��E�ł́A�����܂Ŗ�����1���傫�������������������Ă��邾���ł��B
�@�����悤�ȍl�����́A���^����ɂ����āA�������̃��X�g������悤�Ȋ����`���āA�x���]���ɂ���Ĉ�萔�̗v�f�������X�g��悤�ȏꍇ�ɑ������܂��B
�@�����ł́A�X���b�h��t�@�C�o�[�̊�{�I�Ȏg�������Љ�܂����B���̂Ƃ���A�����ł́A�f�[�^�̐�������ۂ��Ƃ�����A�f�o�b�O������ł���ȂǁA�������ꎩ�g��1���̖{�ɂȂ��Ă��܂��悤�ȕ��G���������Ă��܂��B
�@Thread�N���X��Fiber�N���X�́A�����ł͏Љ�Ă��Ȃ��ł����A�����ƕ��G�Ȃ��Ƃ��s�����߂̃��\�b�h�������Ă��܂��B�ڍׂ́ARuby�̌����y�[�W�Ȃǂ��Q�Ƃ��Ă��������B
�@�����܂ŃX���b�h�������s�����߂�Thread�N���X��Fiber�N���X�ɂ��ďЉ�܂����BRuby�̓X���b�h���T�|�[�g�������ŁA�V�X�e���ŗ��p�ł���ʂ̃v���O�������N�����āA�������Ȃ���悤�ȁu�O���[�����v�Ƃ��Ă̑��ʂ������܂��B
�@��������́ARuby�X�N���v�g���瑼�̃v���O�������N�����A�����𑀂���@���w�т܂��B
�@Ruby�X�N���v�g���瑼�̃R�}���h���N������ł��ȒP�ȕ��@�́A�u`�v�i�o�b�N�N�I�[�g�j���g�������ł��傤�Bpry�Ŋm�F���Ă݂܂��B
[1] pry(main)> `date` => "Sat Nov 22 10:23:12 JST 2014\n"
�@���̃R�}���h���N�����ďo�͂邾���Ȃ�ȒP�ł��B��̂悤�ɁA�o�b�N�N�I�[�g�Ɏ��s�������R�}���h���͂ނ����ł��B�R�}���h�̏o�͕͂�����Ƃ��ĕԂ�܂��B
�@������AKernel���W���[���ɒ�`����Ă���usystem�v���\�b�h���g�����@������܂��Bpry�Ŏ��s���Ă݂܂��傤�B
[2] pry(main)> system("date") Sat Nov 22 10:26:33 JST 2014 => true
�@�usystem�v���\�b�h�̏ꍇ�́A�o�͂̓v���O�����̌Ăяo�����Ɠ����W���o�͂��W���G���[�o�͂ɗ���܂��B�usystem�v���\�b�h�̕Ԃ�l��true��false�ŁA�R�}���h�̏I���X�e�[�^�X��0�i����j�Ȃ�true�A����ȊO�i�����Ă��̏ꍇ�̓G���[�ŏI�������ꍇ�j��false���Ԃ�܂��B
�@���ɂ��A�uexec�v���\�b�h���g�����@������܂��B�������A�uexec�v���\�b�h���g�����ꍇ�́A�usystem�v���\�b�h�̂悤�Ɏ��s���Ԃ��Ă��邱�Ƃ͂Ȃ��A���̂܂܁uexec�v�����s����Ruby�̃v���Z�X�Ƌ��ɏI�����܂��B
�@pry�Ŏ����Ă݂܂��傤�B�uexec "date"�v�����s���ē��t���o�͂��ꂽ��Apry���I�����邱�Ƃ�������ł��傤�B
[8] pry(main)> exec "date" Sat Nov 22 11:30:50 JST 2014
�@���Ԃ̂�����R�}���h����Ɏ��s�������ꍇ�́A�uProcess.spawn�v���\�b�h�����ɗ����܂��BKernel���W���[���ɂ������ȁuspawn�v���\�b�h����`����Ă���̂ŁA�P�Ɂuspawn�v�����ł������܂��B
�@���p���process01.rb�Ɏ����܂��傤�B
pid = Process.spawn "sleep 5; echo terminated" # spawn �ł� puts "waiting..." puts "waiting..." puts "waiting..." Process.waitpid(pid)
$ ruby process01.rb waiting... waiting... waiting... terminated
�@1�s�ڂŐV�����v���Z�X�𗧂��グ�āAsleep�R�}���h��echo�R�}���h�����s���Ă��܂��Bsleep�͎w�肵���b���������~�߂�R�}���h�ŁA�����ł�5�b�X���[�v������ɁA�W���o�͂Ɂuterminated�v�Ƃ��������𗬂��悤�ȃv���Z�X�𗧂��グ�Ă��܂��B
�@2�`4�s�ڂł́A3��uputs�v�����s���āA�W���o�͂Ɂuwaiting...�v�Ƃ���������𗬂��Ă��܂��B
�@�uspawn�v�ŗ����グ���v���Z�X�͔��I�Ɏ��s�����̂ŁA�����܂ł�4�s�����ł�Ruby�X�N���v�g���I�����Ă��܂��܂��B�����ŁA�I����҂ꍇ�ɂ�5�s�ڂ̂悤�ɁuProcess.waitpid�v���\�b�h���g���ďI����҂��܂��B1�s�ڂ�pid�Ƀv���Z�XID���i�[�����̂ŁA5�s�ڂ́uwaitpid�v�ɂ��̃v���Z�XID��^���Ă��܂��B
�@���s���ʂ�����ƕ�����悤�ɁA����sleep��echo�����s����Ă���̂ŁA��Ɂuwaiting...�v���\������Ă���uterminated�v���\������Ă��܂��B�usystem�v��o�b�N�N�I�[�g�ɂ����s���ƁA5�b�҂��āuterminated�v�Ɖ�ʂɕ\������Ă���uwaiting...�v��3��\������邱�ƂɂȂ�܂��B
�@�o�b�N�N�I�[�g��usystem�v���\�b�h���g�����ꍇ�́A�Ăяo�����R�}���h�̏������I���܂ŏo�͂邱�Ƃ��ł��܂���B
�@�ł��̂ŁAping�R�}���h�̂悤�ɁA�W���o�͂ɂЂ�����o�͂��s����悤�ȏꍇ�ɂ��܂��������Ƃ��ł��܂���B���̂悤�ȏꍇ�A�uIO.popen�v���\�b�h���g���ƁA���X�ɑ����Ă���o�͂������ł��܂��Bprocess02.rb�ɗ�������܂��傤�B
IO.popen("ping -c 10 localhost", "r") do |pipe| while line = pipe.gets line.match(/time=(\d\.\d+) ms/) puts line if $1.to_f < 0.1 end end
$ ruby process01.rb PING localhost (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.046 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.066 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.035 ms 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.038 ms 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.077 ms 64 bytes from 127.0.0.1: icmp_seq=9 ttl=64 time=0.035 ms --- localhost ping statistics --- 10 packets transmitted, 10 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.035/0.099/0.246/0.073 ms
�@1�s�ڂ́uIO.popen�v�ŁAlocalhost�ɑ���ping��10��ł悤��ping�R�}���h�����s���A�u���b�N�ϐ��upipe�v��IO�I�u�W�F�N�g������܂��Bping�R�}���h�̏o�͂��p�C�v�ɗ����A�p�C�v���痬��Ă����f�[�^���A�ugets�v���\�b�h�Ŏ��o���C���[�W�ł��B
�@�upipe�v��IO�I�u�W�F�N�g�ł��̂ŁA�t�@�C����W�����o�͂̓ǂݏ����Ɠ����v�̂Ńf�[�^�����o���܂��B2�s�ڂ�pipe����1�s�o�͂����o���A�ϐ�line�Ɋi�[���Ă��܂��B�O��Љ���uio05.rb�v�ƑS�������悤�ȃp�^�[���ɂȂ��Ă��邱�Ƃɒ��ӂ��Ă��������B
�@���̂悤�ɁA���̃R�}���h�̓��o�͂ł���IO�I�u�W�F�N�g�Ƃ��Ē��ۉ�����Ă��āA�����悤�Ɉ�����悤�ɂȂ��Ă��܂��B�����ł́A�ȒP�ɐ������邽�߂ɏo�͂����o���Ă��邾���ł����A���������͂��邱�Ƃ��ł��܂��B����͑f���炵�����Ƃł��I
�@3�s�ڂ͐��K�\�����g���Ă��ď�����₱�����ł����Aping�̏o�͂́utime=0.046 ms�v�̐��l�̕����������o���悤�Ȑ��K�\���ɂȂ��Ă��܂��B�}�b�`���������̕����́A�O���[�o���ϐ��u$1�v�Ɋi�[����܂��B
�@4�s�ڂ́u$1�v�̒l�������ɕϊ����āA0.1��菬������ΕW���o�͂�ping�̌��ʂ����̂܂ܗ����܂��B0.1���傫����A���̂܂̂ĂĂ��܂��܂��B����3�s�ڂŃ}�b�`���Ȃ������ꍇ�i�uPING localhost (127.0.0.1): 56 data bytes�v�̍s�Ȃǁj�́A�u$1�v��nil���i�[����A�unil.to_f�v�̌��ʂ�0.0�ƂȂ�̂ŁA���̍s�͂��܂���ɏo�͂���܂��B
�@���̂悤�ɁA���̃v���Z�X�̏o�͂��t�B���^�[����悤�ȃv���O�������AIO�I�u�W�F�N�g�𗘗p���邱�ƂŊȒP�ɍ�邱�Ƃ��ł��܂��B
Copyright © ITmedia, Inc. All Rights Reserved.