Skip to content

brewlin/goos

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

40 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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