swoole通往大神之路——swoole任务中心说明及进程任务架构搭建
Swoole多任务处理中心
如果你还不会用swoole就out了,swoole通往大神之路——swoole任务中心说明及进程任务架构搭建
教学视频:
一、进程的基本知识
什么是进程,所谓进程其实就是操作系统中一个正在运行的程序,我们在一个终端当中,通过php,运行一个php文件,这个时候就相当于我们创建了一个进程,这个进程会在系统中驻存,申请属于它自己的内存空间系统资源并且运行相应的程序
对于一个进程来说,它的核心内容分为两个部分,一个是它的内存,这个内存是这进程创建之初从系统分配的,它所有创建的变量都会存储在这一片内存环境当中
一个是它的上下文环境我们知道进程是运行在操作系统的,那么对于程序来说,它的运行依赖操作系统分配给它的资源,操作系统的一些状态。
在操作系统中可以运行多个进程的,对于一个进程来说,它可以创建自己的子进程,那么当我们在一个进程中创建出若干个子进程的时候那么可以看到如图,子进程和父进程一样,拥有自己的内存空间和上下文环境
二、进程间通讯
进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。
进程通信有如下的目的:
数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间;
共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到;
进程控制,有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有异常,并能够及时知道它的状态改变。
系统进行进程间通信(IPC)的时候,可用的方式包括管道、命名管道、消息队列、信号、信号量、共享内存、套接字(socket)等形式。
2.1消息队列
消息队列实际上就是一个链表,而消息就是链表中具有特定格式和优先级的记录,对消息队列有写权限的进程可以根据一定规则在消息链表中添加消息,对消息队列有读权限的进程则可以从消息队列中获得所需的信息。
在某个进程往一个消息队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。对于消息队列来说,除非显式删除,否则其一直存在
php实现消息队列操作
在php中通过这两句话就可以创建一个消息队列。 ftok 函数,是可以将一个路径转换成消息队列可用的key值。 msg_get_queue函数的第一个参数 是消息队列的key,第二个参数是消息队列的读写权限,这个权限跟文件类似
msg_send函数,向指定消息队列写入信息。
msg_send ( resource $queue , int $msgtype , mixed $message [, bool $serialize = true [, bool $blocking = true [, int &$errorcode ]]] )
第1个参数 : resource $queue 表示要写入的消息队列资源。
第2个参数 : int $msgtype 表示写入消息队列的 消息类型,这个参数是 配合 msg_receive读取消息队列函数 使用的,下面会说。
第3个参数 : mixed $message 你要发送的信息,最大为 65536 个字节。
第4个参数 : bool $serialize = true 为可选项,是否序列化你发送的消息。
第5个参数 : bool $blocking = true 是否阻塞,当你发送的消息很大,而此时的消息队列无法存入的时候,此时消息队列就会阻塞,除非等到有别的进程从消息队列中读取了别的消息,然后消息队列有足够的空间存储你要发送的信息,才能继续执行。你可以设置这个参数为false,这样你发送信息就会失败,此时错误信息会在 第6个参数 $errorcode中体现,错误码为 MSG_EAGAIN ,你可以根据这个错误码,重新发送你的消息。
第6个参数 : int &$errorcode 记录写入中出现的一系列错误。
读取函数 msg_receive
msg_receive ( resource $queue , int $desiredmsgtype , int &$msgtype , int $maxsize , mixed &$message [, bool $unserialize = true [, int $flags = 0 [, int &$errorcode ]]] )
第1个参数:resource $queue 表示要读取的消息队列资源。
第2个参数 :int $desiredmsgtype 读取的消息类型。这个参数为 0 的时候,你可以读取 msg_send 以任意 消息类型 发送的消息。 如果此参数和你发送的某个消息类型相同,比如你有 2个消息,一个是通过 1类型发送的,一个是通过2 类型发送的。你用 0 可以接收这两种消息 ,而你用 1 只能接收到 以1类型发送的消息。
第3个参数 : int &$msgtype 你读取到的信息,它发送时的消息类型会存储在该参数中。
第4个参数 : int $maxsize 你以多大的字节去读取消息,如果这个值小于你要读取的内容的长度,你会读取失败。
第5个参数 :mixed &$message 读取的内容。
第6个参数 : bool $unserialize = true 内容是否序列化
第7个参数 :int $flags = 0 读取标识。除了默认的0 之外,还有3个参数可选 MSG_IPC_NOWAIT 这个参数表示如果没有从消息队列中读取到信息,会立马返回,并返回错误码 MSG_ENOMSG.
MSG_EXCEPT 这个参数 是配合 第2个参数使用的,如果使用这个参数,你读取到的第一个参数,不是你第一个发送的参数。(队列先进先出)
MSG_NOERROR 如果读取的内容过大,而你指定的第4个参数又不够的时候,它会截断这个消息,并且不报错。
销毁消息队列的方法 :
msg_remove_queue($msg_queue);
swoole通往大神之路——swoole任务中心说明及进程任务架构搭建的更多相关文章
- 通往大神之路,百度Java面试题前200页。
基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie ...
- 【转】hurry_liu 大神STM32移植contiki入门之一:系统介绍和开发环境搭建
前言: 由于项目的原因,需要在LPC1788(STM32 cortex-M3)上面跑contiki. 之前没有涉及到contiki,不知其为何物.不过这个不是难事,做IT的,每每遇到新事物,都不会处理 ...
- WEB前端大神之路之基础篇
CSS篇: 1.CSS权重: 不重复造轮子啦,直接传送门(CSS选择器的权重与优先规则) JavaScript篇: 1.this关键字: 它是一种引用(referent).指向的是当前上下文(cont ...
- 算法大神之路——排序
从今天开始,给自己立下一个目标,每天晚上写一篇算法与数据结构的博客,用来给自己以后的算法工程师的目标铺路! 今天晚上就以算法里面的排序,作为自己的第一章节吧. 排序,就是讲一组数据,按照特定的规则去调 ...
- 详解git rebase,让你走上git大神之路
在之前的文章当中我们介绍了git merge的用法,明白了通过git merge我们可以合并两个分支的改动.这样我们就可以很方便地进行协同开发了,每个人都在自己的分支下开发代码,开发完毕之后再一起合并 ...
- java大神进阶之路
既然励志在java路上走的更远,那就必须了解java的路径.先看图 更加细化的细节如下 一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还 ...
- 前端自学vs跟大神系统学?你看着办
前端自学vs跟大神系统学?你看着办 一名广告专业学生,在大三的时候对于广告行业的前景不是很看好,转而自学web前端,刚开始接触的前端语言是html(html应该不算编程语言),上手很容易,在w3csh ...
- 解迷宫的C++的未完善编程代码........请大神们帮忙改善下.........
这...................................................................... 我也是醉了 看不太懂,大神们求解............ ...
- 【web前端面试题整理04】阿里一行之大神面对面
前言 这段时间我在河南一家公司当了一段时间的前端主管,最后可耻的匿了,原因各种各样,最主要的就是不想呆在郑州了. 其实这里的同事还是很不错的,面对老总最后的挽留我不是没有动心,而是这个地方确实不太好, ...
随机推荐
- selenium webdriver学习(二)————对浏览器的简单操作(转载JARVI)
selenium webdriver学习(二)————对浏览器的简单操作 博客分类: Selenium-webdriver selenium webdriver对浏览器的简单操作 打开一个测试浏览 ...
- BZOJ 1935 Tree 园丁的烦恼 CDQ分治/主席树
CDQ分治版本 我们把询问拆成四个前缀和,也就是二维前缀和的表达式, 我们把所有操作放入一个序列中 操作1代表在x,y出现一个树 操作2代表加上在x,y内部树的个数 操作3代表减去在x,y内部树的个数 ...
- STS Eclipse IDEA 指定启动JDK版本
使用场景: 开发人员在自己的机器上可能装了多个版本的JDK,但是在环境变量中只能配置一个 JAVA_HOME ,so你的IDEA Eclipse 可能因为你在 JAVA_HOME 配置JDK1.8 以 ...
- Tyvj 1864 [Poetize I]守卫者的挑战
P1864 [Poetize I]守卫者的挑战时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻 ...
- Android图形子系统
图形操作可以有两种方式实现:一是利用通用CPU模拟图形操作:二是利用GPU专门做图形操作.前者会增加CPU的负担,在现在高分辨率已经是普遍现象的时候,让通用处理器来完成大量的图形计算已经不现实.And ...
- oracle 基础表的选择
基础表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问). 根据优化器的不同, SQL语句中基础表的选择是不一样的. 如果你使用的是CBO (COST BASED OPTI ...
- Python--day72--Django内置的serializers序列化介绍
序列化 Django内置的serializers def books_json(request): book_list = models.Book.objects.all()[0:10] from d ...
- linux inode 结构
inode 结构由内核在内部用来表示文件. 因此, 它和代表打开文件描述符的文件结构是不 同的. 可能有代表单个文件的多个打开描述符的许多文件结构, 但是它们都指向一个单个 inode 结构. ino ...
- element-ui tree 根据不同叶子节点设置是否显示复选框
公司业务要求不同根节点配置显示与否复选框,官方文档没有这样的配置,所以想到了修改element-ui源码. 1.这里将“node_modules\element-ui\packages”下的tree文 ...
- 【js】vue 2.5.1 源码学习 (四) 钩子函数 资源选项 watch 的合并策略
大体思路 (三) 1.钩子函数 自定义策略 LIFECYCLE_HOOKS= [] created = [function(){} , function(){}] 组装方法 ...