精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● CGI>>[日记文]初涉多路复用

主题:[日记文]初涉多路复用
发信人: dem0n4lex(啊神)
整理人: workingnow(2004-01-16 20:33:05), 站内信件
[日记文]初涉多路复用

writer: demonalex
email: demonalex_at_hackermail.com


    这次介绍的是IO::Select包,使用这个接口可以实现多路复用。
==================================================================================================
    首先又是说说它最基本的方法:
------------------------------------------------------------------------------------------
new()方法:
$select=IO::Select->new([@handles]);
讲解:新建一个IO::Select对象。返回值是新建的IO::Select对象变量;参数可选,为需要监视的句
柄集数组。
------------------------------------------------------------------------------------------
add()方法:
$select->add(@handle);
讲解:加入需要监视的数组集合。无返回值;参数值为需要加入的监视句柄(可以是一个数组集合,
也可以是单个)。注意:当在调用new()方法新建IO::Select对象变量时没有加载需要监视的句柄的话
,那么就一定要调用这个方法来加载。
------------------------------------------------------------------------------------------
remove()方法:
$select->remove(@handle);
讲解:从IO::Select对象变量中卸下某个被监视的句柄或句柄集。无返回值;参数为需要卸下某个被
监视的句柄或句柄集。
------------------------------------------------------------------------------------------
can_read()方法:
@result=$select->can_read([$timeout]);
讲解:对IO::Select对象变量进行‘可读’状态测试。返回值为可读状态的句柄的列表;参数可选,
为等待超时值。
------------------------------------------------------------------------------------------
can_write()方法:
@result=$select->can_write([$timeout]);
讲解:对IO::Select对象变量进行‘可写’状态测试。返回值为可写状态的句柄的列表;参数可选,
为等待超时值。
------------------------------------------------------------------------------------------
==================================================================================================
    现在说说简单的调用流程:
建立IO::Select对象变量->加入监视句柄(或句柄数组)->进入一个循环体,在循环体内不停地测试
句柄列表的状态->使用条件结构,针对不同的结构进行相应的行为->在最后关闭IO::Select对象变

==================================================================================================
    CPAN中提示的泛例:
------------------------------------------------------------------------------------------
use IO::Select;
use IO::Socket;
$lsn = new IO::Socket::INET(Listen => 1, LocalPort => 8080);
$sel = new IO::Select( $lsn );

    while(@ready = $sel->can_read) {
        foreach $fh (@ready) {
            if($fh == $lsn) {
                # Create a new socket
                $new = $lsn->accept;
                $sel->add($new);
            }
            else {
                # Process socket

                # Maybe we have finished with the socket
                $sel->remove($fh);
                $fh->close;
            }
        }
    }
------------------------------------------------------------------------------------------
==================================================================================================
    这种技术最为科学,不过调用起来比较复杂,适合于专业人士使用。



----
You may say I am a dreamer
But I am not the only one
I hope someday you will join us
And the world will be as one.

http://demonalex.dark2s.org

[关闭][返回]