文档章节

php模拟js单线程异步(setTimeout)

dubox
 dubox
发布于 2017/03/30 18:09
字数 171
阅读 18
收藏 0
<?php


$GLOBALS['setTimeoutFn'] = [];

function msectime()
{
    list($msec, $sec) = explode(' ', microtime());
    return (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
}

function setTimeout($fn , $time_out = 0){

    $exe_time = msectime() + $time_out; //这里记录将要执行的时间点 而不是等待时间
    $GLOBALS['setTimeoutFn'][$exe_time.substr(md5(microtime()) ,1,5)] = [
        'fn' => $fn,
        'exe_time' => $exe_time,
    ];
}

function onEnd(){
    $setTimeoutFn = $GLOBALS['setTimeoutFn'];
    ksort($setTimeoutFn);   //排序 

    while(count($setTimeoutFn)){

        $now = array_shift($setTimeoutFn);

        if($now['exe_time'] <= msectime()){
            $now['fn']();
        }else{
            usleep( ($now['exe_time'] - msectime()) * 1000 );
            $now['fn']();
        }

    }

}


setTimeout(function(){
    echo 'sto1:'.msectime().'<br>';
} , 3000);

//do something
for($i=0;$i<10000;$i++){
    $t = msectime();
}
echo '$t:'.$t.'<br>';

setTimeout(function()use($t){
    echo 'sto2:'.msectime().'<br>';
} , 10);

echo '--------------------------------<br>';


/**
 * 所有代码执行完毕 再执行异步函数
 * js中一样要等到主线程空闲才会执行异步函数
 **/
onEnd();

/**
输出:
$t:1490867753698
--------------------------------
sto2:1490867753710
sto1:1490867756652

 */

 

© 著作权归作者所有

共有 人打赏支持
dubox
粉丝 3
博文 92
码字总数 26425
作品 0
西安
程序员
Javascript是单线程的深入分析

面试的时候发现99%的童鞋不理解为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的?还有non-blocking IO, event loop等概念很不清楚。来深入分析...

stone_
2014/04/15
0
0
JavaScript可否多线程? 深入理解JavaScript定时机制

JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好...

李长春
2012/11/09
0
0
JavaScript可否多线程? 深入理解JavaScript定时机制

JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好...

李长春
2012/11/09
0
0
JavaScript定时机制setTimeout与setInterval研究

容易欺骗别人感情的JavaScript定时器 本文转自:爱微网 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都...

西西爱OS
2012/10/25
0
0
一篇文章读懂JavaScript的EventLoop

JavaScript的单线程 众所周知JavaScript程序是单线程的执行,也就是说,同一时刻只能做一件事,这也是由于JavaScript本身就是为了浏览器而生,主要用途是用户交互和操作dom,为什么是单线程?...

阳光的记忆
05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Windows小技巧 – Win+R提高Windows使用效率

追求效率的朋友都需要一款顺手的快速启动工具,Win 平台上有键盘流的RunZ、Listary、ALTRun、Launchy、Wox 和图标流的 Fences、Rolan、 WinLaunch 等,而 Mac 上也有 Alfred、Spotlight。 而...

QQZZFT
11分钟前
1
0
Android 移植ffmpeg报错:"atof" referenced by "libavformat.so"

cannot locate symbol "atof" referenced by "libavformat-57.so"... 原因:android的stdlib.h中atof是内联的, 外部模块不能直接使用。跟android版本有关。 解决办法:将所有的atof改成str...

她叫我小渝
25分钟前
1
0
Java并发编程:volatile关键字解析

volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生...

engeue
41分钟前
1
0
php-fpm配置文件详解

第一部分:FPM 配置 参数          | 说明 -p            | 命令行中动态修改--prefix   ;include=etc/fpm.d/*.conf  | 用于包含一个或多个文件,如果glob(3)存在(...

bengozhong
43分钟前
1
0
Django允许外部ip访问

1、关闭防火墙 service iptables stop 2、设置django 开启django时,使用0.0.0.0:xxxx,作为ip和端口例如: python manage.py runserver 0.0.0.0:8000 3、在settings里修改ALLOWED_HOSTS = [......

MichaelShu
46分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部