今天研究了worker stackable的配合方法,写了两种形式,虽然能工作,但是都会出现内存不听增长的问题;

于是把第一个方法的代码邮件给了作者,到现在他没有回复我。

我最后放弃两者配合的方式,直接使用worker,发现到现在执行了582000个工作,内存没有增长,速度也基本稳定,代码如下:

<?php
ini_set('zend.enable_gc', true); class ExampleWorker extends Worker {
public $stack_count = 0;
public function __construct() {}
public function run(){
sleep(1);//waiting for data
$count = 0;
$data_flag = true;
$stime = microtime(true);
while(1){
if($data = $this->shift()){
$data_flag = true;
$this->doSomeWork();
if((++$count)%1000==0){
printf("Work Mermory used %.3fMB RAM, time: %3f===> %d \n",
memory_get_peak_usage(true)/1048576, (microtime(true) - $stime), $count);
$stime = microtime(true);
}
}else{
usleep(100000);
}
}
exit;
}
private function doSomeWork(){
$str = 'sdalsadkfkasd;lfksa;ldfkas;lkf;lsadkf;as';
$len = strlen($str); $s = substr($str,rand(0,$len));
$len = floor(strlen($s)/2); for($i=0;$i<$len;$i++){
$tmp = $s[$i];
$idx = intval($len-$i-1); $s[$i] = $s[$idx];
$s[$idx] = $tmp;
}
}
} $worker= new ExampleWorker(sprintf("Worker [%d]", 0));
$worker->start(); $stime = microtime(true);
$count = 3000000;//99999999;
$total = $count*5; $ct = 0;
while($count--){
//for ($target = 0; $target < 5; $target++)
$worker[]='data_'.(++$ct);
usleep(rand(200,1800));
}
//sleep(10);
$runtime = (microtime(true)-$stime);
printf("---------------------------------------------------------\n");
printf("Used time is %f \n", $runtime);
printf("Mermory used %.3fMB RAM, added %d, left %d\n", memory_get_peak_usage(true)/1048576, $total, count($worker));
printf("---------------------------------------------------------\n"); //var_dump($works);

虚拟上的运行速度:

Work Mermory used 0.250MB RAM, time: 2.141709===> 607000
Work Mermory used 0.250MB RAM, time: 1.721918===> 608000
Work Mermory used 0.250MB RAM, time: 1.858363===> 609000
Work Mermory used 0.250MB RAM, time: 1.734542===> 610000
Work Mermory used 0.250MB RAM, time: 1.819794===> 611000
Work Mermory used 0.250MB RAM, time: 1.847132===> 612000
Work Mermory used 0.250MB RAM, time: 1.740353===> 613000
Work Mermory used 0.250MB RAM, time: 1.628364===> 614000
Work Mermory used 0.250MB RAM, time: 1.731518===> 615000
Work Mermory used 0.250MB RAM, time: 1.730583===> 616000
Work Mermory used 0.250MB RAM, time: 1.825315===> 617000
Work Mermory used 0.250MB RAM, time: 1.762334===> 618000
Work Mermory used 0.250MB RAM, time: 1.842860===> 619000
Work Mermory used 0.250MB RAM, time: 1.732677===> 620000

php pthreads 多线程扩展的使用:一个较为稳定例子。的更多相关文章

  1. PHP安装pthreads多线程扩展教程[windows篇]

    from:http://blog.csdn.net/aoyoo111/article/details/19020161 一.判断PHP是ts还是nts版 通过phpinfo(); 查看其中的 Thre ...

  2. windows下xampp安装PHP的pthreads多线程扩展

    我的运行环境: 系统:windows10 ,64位 PHP:5.6.8 TS,VC11 ,32位 Apache: 2.0 我安装的是xampp集成环境 pthreads的windows扩展文件下载地址 ...

  3. Windows环境下PHP安装pthreads多线程扩展

    一.判断PHP是ts还是nts版 通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说应该是ts版,否则是nts版. ...

  4. Windows下PHP多线程扩展pthreads的安装

    pthreads扩展安装步骤 1.查看phpinfo() 获取PHP版本号及位数(x86表示32位,x64表示64位).编译器版本.PHP配置文件加载所在位置等.如下图所示: 2.pthreads扩展 ...

  5. Unicode其实是Latin1的扩展。只有一个低字节的Uncode字符其实就是Latin1字符——附各种字符编码表及转换表

    一.概念 1,ASCII             ASCII(American Standard Code for Information Interchange),中文名称为美国信息交换标准代码.是 ...

  6. Linux是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播。

    Linux是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播. Linux是众多操作系统之一 , 目前流行的服务器和 PC 端操作系统有 L ...

  7. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  8. [转]自己写PHP扩展之创建一个类

    原文:http://www.imsiren.com/archives/572 比如我们要创建一个类..PHP代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  9. linq to sql用partial扩展属性,创建一个部分类(用于多表连接)

    1.在窗体中创建dataGridView显示表: using System; using System.Collections.Generic; using System.ComponentModel ...

随机推荐

  1. HDU5829 NTT

    以下这份代码并没有过.但感觉没有问题.不是蜜汁WA就是蜜汁T. #include <cstdio> #include <iostream> #include <cstri ...

  2. python利用xmlrpc方式对odoo数据表进行增删改查操作

    # -*- encoding: utf-8 -*- import xmlrpclib #导入xmlrpc库,这个库是python的标准库. username ='admin' #用户登录名 pwd = ...

  3. Round robin

    http://www.computerhope.com/jargon/r/rounrobi.htm Round robin Round robin is a method of distributin ...

  4. 【Todo】Python面试题分析记录(修饰器等)

    首先,看这一段代码: class A(object): x = 1 gen = (lambda t: (t for _ in xrange(10)))(x) if __name__ == '__mai ...

  5. MyBatis——解决字段名与实体类属性名不相同的冲突

    原文:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况 ...

  6. Oracle 删除重复的记录,只保留一条

    查询及删除重复记录的SQL语句   1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断   select * from 表 where Id in (select Id from 表 g ...

  7. 转:最小区间:k个有序的数组,找到最小区间使k个数组中每个数组至少有一个数在区间中

    转:http://www.itmian4.com/thread-6504-1-1.html 最小区间原题 k个有序的数组,找到最小的区间范围使得这k个数组中,每个数组至少有一个数字在这个区间范围内.比 ...

  8. Myeclipse6.5项目启动时由于数据库连接失败的错误日志

    Java HotSpot(TM) 64-Bit Server VM warning: MaxNewSize (524288k) is equal to or greater than the enti ...

  9. python语法笔记(七)

    python标准库 Python有一套很有用的标准库(standard library).标准库会随着Python解释器,一起安装在你的电脑中的.它是Python的一个组成部分.这些标准库是Pytho ...

  10. 20145218 《Java程序设计》第7周学习总结

    20145218 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 Lambda 如果使用JDK8的话,可以使用Lambda特性去除重复的信息. 在只有Lambda表达式的情 ...