/goos

GPM 多线程协程调度器 for PHP Extension,multi-core concurrency library

Primary LanguageC++Apache License 2.0Apache-2.0

goos

GitHub issues GitHub forks GitHub license

GPM 多线程协程调度器 for PHP Extension

NOTICE:TSRM 使变量共享变得复杂和低效,目前仅用于学习研究

process

  • php环境线程隔离,协程隔离
  • 实现G-M调度,任意协程G创建后,自动绑定到线程M上去执行
  • 实现多线程协程G调度,切出与恢复
  • 优化php内存相关
  • 引入P, 实现G-P-M 任务窃取调度
  • 协程栈自动收缩,防止 stack overflow
  • c&php 协程栈复用
  • 实现抢占调度,可以对任意在执行的协程发起抢占
  • 优化抢占调度,检查任意超过10ms持有G的线程,发起抢占调度

config & install

# 编译php必须加上 ZTS支持
> wget https://www.php.net/distributions/php-7.3.5.tar.gz
> tar zxvf php-7.3.5.tar.gz & cd php-7.3.5
> ./configure --prefix=/path/to/  --enable-cli --with-config-file-path=/path/to/etc 
--sysconfdir=/path/to/etc --enable-maintainer-zts

# 编译扩展
> cd /path/to/goos
> php7.3.5-ize
> ./configure --with-php-config=php7.3.5-config
> make install
> echo 'extension=go.so' >> phpetcpath/php.ini 

@G-M 多线程调度

<?php
Runtime::GOMAXPROCS(10);
$ref = ["ref"];
for($i = 0;$i <100; $i++)
{
    //support reference params
    go(function()use($i,&$ref){
       go(function(){
           var_dump($i,$ref);
       });
    });
}
Runtime::wait();

@G-P-M 任务窃取调度

@G-P-M 信号抢占调度

<?php
//设置只有一个工作线程,在不抢占的情况下,永远无法触发 go 2
Runtime::GOMAXPROCS(1);
go(function(){
    for(;;) echo "go 1\n"; 
});
go(function(){
    for(;;) echo "go 2\n";
});
Runtime::wait();

docs