PythonÅàѵ֮pythonÈý´ó²¢·¢·þÎñÆ÷
¸üÐÂʱ¼ä:2016Äê09ÔÂ21ÈÕ14ʱ09·Ö À´Ô´:ÀÖÓã²¥¿ÍPythonÅàѵѧԺ ä¯ÀÀ´ÎÊý:
1.select
select×îÔçÓÚ1983Äê³öÏÖÔÚ4.2BSDÖУ¬Ëüͨ¹ýÒ»¸öselect()ϵͳµ÷ÓÃÀ´¼àÊÓ¶à¸öÎļþÃèÊö·ûµÄÊý×飬µ±select()·µ»Øºó£¬¸ÃÊý×éÖоÍÐ÷µÄÎļþÃèÊö·û±ã»á±»ÄÚºËÐ޸ıê־λ£¬Ê¹µÃ½ø³Ì¿ÉÒÔ»ñµÃÕâЩÎļþÃèÊö·û´Ó¶ø½øÐкóÐøµÄ¶Áд²Ù×÷¡£
selectĿǰ¼¸ºõÔÚËùÓÐµÄÆ½Ì¨ÉÏÖ§³Ö£¬ÆäÁ¼ºÃ¿çƽ̨֧³ÖÒ²ÊÇËüµÄÒ»¸öÓŵ㣬ÊÂʵÉÏ´ÓÏÖÔÚ¿´À´£¬ÕâÒ²ÊÇËüËùÊ£²»¶àµÄÓŵãÖ®Ò»¡£
selectµÄÒ»¸öȱµãÔÚÓÚµ¥¸ö½ø³ÌÄܹ»¼àÊÓµÄÎļþÃèÊö·ûµÄÊýÁ¿´æÔÚ×î´óÏÞÖÆ£¬ÔÚLinuxÉÏÒ»°ãΪ1024£¬²»¹ý¿ÉÒÔͨ¹ýÐ޸ĺ궨ÒåÉõÖÁÖØÐ±àÒëÄں˵ķ½Ê½ÌáÉýÕâÒ»ÏÞÖÆ¡£
ÁíÍ⣬select()Ëùά»¤µÄ´æ´¢´óÁ¿ÎļþÃèÊö·ûµÄÊý¾Ý½á¹¹£¬Ëæ×ÅÎļþÃèÊö·ûÊýÁ¿µÄÔö´ó£¬Æä¸´ÖƵĿªÏúÒ²ÏßÐÔÔö³¤¡£Í¬Ê±£¬ÓÉÓÚÍøÂçÏìӦʱ¼äµÄÑÓ³ÙʹµÃ´óÁ¿TCPÁ¬½Ó´¦ÓÚ·Ç»îԾ״̬£¬µ«µ÷ÓÃselect()»á¶ÔËùÓÐsocket½øÐÐÒ»´ÎÏßÐÔɨÃ裬ËùÒÔÕâÒ²ÀË·ÑÁËÒ»¶¨µÄ¿ªÏú¡£
ÔÀí£º
ÔÚpythonÖУ¬selectº¯ÊýÊÇÒ»¸ö¶Ôµ×²ã²Ù×÷ϵͳµÄÖ±½Ó·ÃÎʵĽӿڡ£ËüÓÃÀ´¼à¿Øsockets¡¢filesºÍpipes£¬µÈ´ýIOÍê³É£¨Waiting for I/O completion£©¡£µ±ÓпɶÁ¡¢¿Éд»òÊÇÒ쳣ʼþ²úÉúʱ£¬select¿ÉÒÔºÜÈÝÒ×µÄ¼à¿Øµ½¡£
select.select£¨rlist, wlist, xlist[, timeout]£© ´«µÝÈý¸ö²ÎÊý£¬Ò»¸öΪÊäÈë¶ø¹Û²ìµÄÎļþ¶ÔÏóÁÐ±í£¬Ò»¸öΪÊä³ö¶ø¹Û²ìµÄÎļþ¶ÔÏóÁбíºÍÒ»¸ö¹Û²ì´íÎóÒì³£µÄÎļþÁÐ±í¡£µÚËĸöÊÇÒ»¸ö¿ÉÑ¡²ÎÊý£¬±íʾ³¬Ê±ÃëÊý¡£Æä·µ»Ø3¸ötuple£¬Ã¿¸ötuple¶¼ÊÇÒ»¸ö×¼±¸ºÃµÄ¶ÔÏóÁÐ±í£¬ËüºÍǰ±ßµÄ²ÎÊýÊÇÒ»ÑùµÄ˳Ðò¡£ÏÂÃæ£¬Ö÷Òª½áºÏ´úÂ룬¼òµ¥ËµËµselectµÄʹÓá£
³ÌÐò¹ý³Ì£º
1¡¢¸Ã³ÌÐòÖ÷ÒªÊÇÀûÓÃsocket½øÐÐͨÐÅ£¬½ÓÊÕ¿Í»§¶Ë·¢Ë͹ýÀ´µÄÊý¾Ý£¬È»ºóÔÙ·¢»¹¸ø¿Í»§¶Ë¡£
2¡¢Ê×ÏȽ¨Á¢Ò»¸öTCP/IP socket£¬²¢½«ÆäÉèΪ·Ç×èÈû£¬È»ºó½øÐÐbindºÍlisten¡£
3¡¢Í¨¹ýselectº¯Êý»ñÈ¡µ½ÈýÖÖÎļþÁÐ±í£¬·Ö±ð¶Ôÿ¸öÁбíµÄÿ¸öÔªËØ½øÐÐÂÖѯ£¬¶Ô²»Í¬socket½øÐв»Í¬µÄ´¦Àí£¬×îÍâ²ãÑ»·Ö±µ½inputsÁбíΪ¿ÕΪֹ
4¡¢µ±ÉèÖÃtimeout²ÎÊýʱ£¬Èç¹û·¢ÉúÁ˳¬Ê±£¬selectº¯Êý»á·µ»ØÈý¸ö¿ÕÁÐ±í¡£
2.poll
pollÔÚ1986Äêµ®ÉúÓÚSystem V Release 3£¬ËüºÍselectÔÚ±¾ÖÊÉÏûÓжà´ó²î±ð£¬µ«ÊÇpollûÓÐ×î´óÎļþÃèÊö·ûÊýÁ¿µÄÏÞÖÆ¡£
pollºÍselectͬÑù´æÔÚÒ»¸öȱµã¾ÍÊÇ£¬°üº¬´óÁ¿ÎļþÃèÊö·ûµÄÊý×é±»ÕûÌ叴֯ÓÚÓû§Ì¬ºÍÄں˵ĵØÖ·¿Õ¼äÖ®¼ä£¬¶ø²»ÂÛÕâЩÎļþÃèÊö·ûÊÇ·ñ¾ÍÐ÷£¬ËüµÄ¿ªÏúËæ×ÅÎļþÃèÊö·ûÊýÁ¿µÄÔö¼Ó¶øÏßÐÔÔö´ó¡£
ÁíÍ⣬select()ºÍpoll()½«¾ÍÐ÷µÄÎļþÃèÊö·û¸æËß½ø³Ìºó£¬Èç¹û½ø³ÌûÓÐ¶ÔÆä½øÐÐIO²Ù×÷£¬ÄÇôÏ´ε÷ÓÃselect()ºÍpoll()µÄʱºò½«Ôٴα¨¸æÕâЩÎļþÃèÊö·û£¬ËùÒÔËüÃÇÒ»°ã²»»á¶ªÊ§¾ÍÐ÷µÄÏûÏ¢£¬ÕâÖÖ·½Ê½³ÆÎªË®Æ½´¥·¢£¨Level Triggered£©¡£
3.epoll
Ö±µ½Linux2.6²Å³öÏÖÁËÓÉÄÚºËÖ±½ÓÖ§³ÖµÄʵÏÖ·½·¨£¬ÄǾÍÊÇepoll£¬Ëü¼¸ºõ¾ß±¸ÁË֮ǰËù˵µÄÒ»ÇÐÓŵ㣬±»¹«ÈÏΪLinux2.6ÏÂÐÔÄÜ×îºÃµÄ¶à·I/O¾ÍÐ÷֪ͨ·½·¨¡£
epoll¿ÉÒÔͬʱ֧³Öˮƽ´¥·¢ºÍ±ßÔµ´¥·¢£¨Edge Triggered£¬Ö»¸æËß½ø³ÌÄÄЩÎļþÃèÊö·û¸Õ¸Õ±äΪ¾ÍÐ÷״̬£¬Ëüֻ˵һ±é£¬Èç¹ûÎÒÃÇûÓвÉÈ¡Ðж¯£¬ÄÇôËü½«²»»áÔٴθæÖª£¬ÕâÖÖ·½Ê½³ÆÎª±ßÔµ´¥·¢£©£¬ÀíÂÛÉϱßÔµ´¥·¢µÄÐÔÄÜÒª¸ü¸ßһЩ£¬µ«ÊÇ´úÂëʵÏÖÏ൱¸´ÔÓ¡£
epollͬÑùÖ»¸æÖªÄÇЩ¾ÍÐ÷µÄÎļþÃèÊö·û£¬¶øÇÒµ±ÎÒÃǵ÷ÓÃepoll_wait()»ñµÃ¾ÍÐ÷ÎļþÃèÊö·ûʱ£¬·µ»ØµÄ²»ÊÇʵ¼ÊµÄÃèÊö·û£¬¶øÊÇÒ»¸ö´ú±í¾ÍÐ÷ÃèÊö·ûÊýÁ¿µÄÖµ£¬ÄãÖ»ÐèҪȥepollÖ¸¶¨µÄÒ»¸öÊý×éÖÐÒÀ´ÎÈ¡µÃÏàÓ¦ÊýÁ¿µÄÎļþÃèÊö·û¼´¿É£¬ÕâÀïҲʹÓÃÁËÄÚ´æÓ³É䣨mmap£©¼¼Êõ£¬ÕâÑù±ã³¹µ×Ê¡µôÁËÕâЩÎļþÃèÊö·ûÔÚϵͳµ÷ÓÃʱ¸´ÖƵĿªÏú¡£
ÁíÒ»¸ö±¾ÖʵĸĽøÔÚÓÚepoll²ÉÓûùÓÚʼþµÄ¾ÍÐ÷֪ͨ·½Ê½¡£ÔÚselect/pollÖУ¬½ø³ÌÖ»ÓÐÔÚµ÷ÓÃÒ»¶¨µÄ·½·¨ºó£¬Äں˲ŶÔËùÓмàÊÓµÄÎļþÃèÊö·û½øÐÐɨÃ裬¶øepollÊÂÏÈͨ¹ýepoll_ctl()À´×¢²áÒ»¸öÎļþÃèÊö·û£¬Ò»µ©»ùÓÚij¸öÎļþÃèÊö·û¾ÍÐ÷ʱ£¬Äں˻á²ÉÓÃÀàËÆcallbackµÄ»Øµ÷»úÖÆ£¬Ñ¸ËÙ¼¤»îÕâ¸öÎļþÃèÊö·û£¬µ±½ø³Ìµ÷ÓÃepoll_wait()ʱ±ãµÃµ½Í¨Öª¡£
±¾ÎİæÈ¨¹éÀÖÓã²¥¿ÍPythonѧԺËùÓУ¬»¶Ó×ªÔØ£¬×ªÔØÇë×¢Ã÷×÷Õß³ö´¦¡£Ð»Ð»£¡
×÷ÕߣºÀÖÓã²¥¿ÍPythonÅàѵѧԺ
Ê×·¢£ºhttp://www.itcast.cn/python/