V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xing393939
V2EX  ›  PHP

关于多进程多协程的疑惑

  •  
  •   xing393939 · 2020-07-13 15:45:20 +08:00 · 953 次点击
    这是一个创建于 1400 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对系统底层了解的不多,想通过这个点学习一下。我先运行了两个例子

    1. php+pthreads 扩展跑两个线程,用到 sleep 函数(听说 sleep 是同步阻塞的)

    <?php
    
    class Test extends Thread
    {
        public function run()
        {
            sleep(1);
            var_dump($this->getThreadId());
        }
    }
    
    $t = microtime(1);
    $t1 = new Test();
    $t2 = new Test();
    $t1->start();
    $t2->start();
    $t1->join();
    $t2->join();
    
    var_dump(microtime(1) - $t);
    

    2. php+swoole 扩展跑两个协程,用到 Co::sleep ( Co::sleep 是异步非阻塞的,配合协程可以实现并发)

    <?php
    go(function () {
        Co::sleep(1);
        var_dump(Co::getCid() . " " . microtime(1));
    });
    
    go(function () {
        Co::sleep(1);
        var_dump(Co::getCid() . " " . microtime(1));
    });
    
    var_dump("done");
    

    总结

    这 2 个示例的总执行时间都是 1 秒。

    根据我现在了解的知识,示例 2 是单进程单线程的,在协程环境中遇到 io 阻塞(Co::sleep),通过切换协程继续向下执行,因而实现了并发,这个还是很好理解的。示例 1 是单进程多线程的,即使是有 sleep 这样同步阻塞的任务,仍然可以并发执行,是因为用到了 cpu 的多核吗?怎么去验证呢?

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2989 人在线   最高记录 6547   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:13 · PVG 23:13 · LAX 08:13 · JFK 11:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.