热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

swoole的task以及线程使用案例

<?php$workers[];$worker_num2;for($i1;$i<$worker_num;$i++){$processnews
useQueue();//开启队列,类似全局函数
	$pid = $process->start();
	$worders[$pid] = $process;
}
function doProcess(swoole_process $process){
	$recv = $process->pop();
	echo "get data from master process is $recv \n";
	sleep(5);
	$process->exit(0);
}
foreach($worders as $pid=>$process){
	$process->push("hello son process $pid");
}
for($i = 1;$i <= $worker_num; $i++){
	$ret = swoole_process::wait();
	$pid = $ret['pid'];
	unset($workers[$pid]);
	echo "son process $pid is out \n";
}

 task使用案例

set([
	'task_worker_num'	=> 4
]);
$serv->on('receive',function($serv,$fd,$from_id,$data){
		$task_id = $serv->task($data);
		echo "ID:$task_id\n";
});
$serv->on('task',function($serv,$task_id,$from_id,$data){
		echo "do ID:$task_id\n";
		$serv->finish("$data -> ok");
});

$serv->on('finish',function($serv,$task_id,$data){
	echo "do ok\n";
});
$serv->start();

process以及task利用定时器进行动态加载进程池(稍难)

process = new swoole_process([$this,'run'],false,2);
		$this->process->start();
		swoole_process::wait();
	}
	public function run()
	{
		$this->current_num = $this->worker_min_num;
		for( $i = 0; $i <$this->current_num; $i++){
			$process = new swoole_process([$this,'task_run'],false,2);
			$pid = $process->start();
			$this->process_list[$pid] = $process;
			$this->process_use[$pid] = 0;
		}
		foreach($this->process_list as $pid=>$process){
			swoole_event_add($process->pipe,function($pipe) use($process){
				$data = $process->read();
				var_dump($data);
				$process_use[$data] = 0;
			});
		}
		//核心部分start
		swoole_timer_tick(1000,function($time_id){
			static $index = 0;
			$index = $index + 1;
			$flag = true;
			foreach($this->process_use as $pid=>$used){
				if($used == 0){
					$flag = false;
					$this->process_use[$pid] = 1;
					$this->process_list[$pid]->write($index . ':hello');
					break;
				}
			}
			if($flag = true && $this->current_num <$this->worker_max_num){
				$process = new swoole_process([$this,'task_run'],false,2);
				$pid = $process->start();
				$this->process_list[$pid] = $process;
				$this->process_use[$pid] = 1;
				$this->process_list[$pid]->write($index . ":hello");
				$this->current_num ++;
			}
			if( $index = 10){
				foreach($this->process_list as $process){
					$process->write('exit');
				}
				swoole_timer_clear($time_id);
				$this->process->exit();
			}
			
		});
		//核心部分end
	}
	public function task_run($worker)
	{	
		swoole_event_add($worker->pipe,function($pipe) use ($worker){
			$data = $worker->read();
			var_dump($worker->pid.":".$data);
			if($data =='exit'){
				$worker->exit();
				exit;
			}
			sleep(5);
			$worker->write(''.$worker->pid);

		});
	}
}
new BaseProcess();

 

 


推荐阅读
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 本文将深入探讨 iOS 中的 Grand Central Dispatch (GCD),并介绍如何利用 GCD 进行高效多线程编程。如果你对线程的基本概念还不熟悉,建议先阅读相关基础资料。 ... [详细]
  • 本文详细介绍了如何使用Python的多进程技术来高效地分块读取超大文件,并将其输出为多个文件。通过这种方式,可以显著提高读取速度和处理效率。 ... [详细]
  • 数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇
    数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • 双指针法在链表问题中应用广泛,能够高效解决多种经典问题,如合并两个有序链表、合并多个有序链表、查找倒数第k个节点等。本文将详细介绍这些应用场景及其解决方案。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 构建基础的字符串队列实现方法
    在探讨如何构建基础的字符串队列实现方法时,我们发现许多开发者在面对这一问题时常常感到困惑。实际上,队列的基本原理非常简单,即遵循先进先出的原则。然而,在具体实现过程中,需要注意的是Java语言中并没有指针的概念,因此需要通过嵌套类来模拟指针,进而构建链表结构。这种实现方式不仅能够有效地管理字符串数据,还能提升代码的可读性和维护性。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
author-avatar
紫色冰姬YOU
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有