同步代码主要是指调用某个逻辑时,会等待到该逻辑返回调用结果.
例如:php
<?php $num = 30; $result = M('test')->select();//伪代码,查询数据库 sleep(3);//伪代码,当成执行了3秒才返回 echo json_encode($result);//返回数据
只有当select查询到数据时,才会返回数据给$result,这个值必定是数据库操做完毕返回的值ajax
例如:sql
<?php $num = -30; $result = abs($num); echo json_encode($result);//返回数据
abs会返回数据给$result,这个值必定是abs正确操做的值数据库
例如:
用户请求www.easyswoole.com,页面会一直等待easyswoole响应数据.json
例如:swoole
<?php //模拟发送邮件中 $status = send(); sleep(30);//发送邮件花费30秒 echo "发送邮件".$status?'完成':'失败';
等待发送邮件的成功/失败,就是同步异步
异步代码主要是指调用某个逻辑时,不会等待该逻辑返回的结果,只会返回是否已经调用的最初结果(或不返回)
例如:socket
调用$.ajax(),默认状况下是异步ajax,它会继续往下执行代码,当有结果返回时经过回调事件进行处理.函数
例如:网站
<?php $pid = pcntl_fork(); if ($pid == 0) { //子进程 //模拟发送邮件 sleep(30);//发送邮件花费30秒 exit(0); } pcntl_waitpid($pid, $status, WNOHANG); echo "发送邮件中";
经过新开一个进程去处理发送邮件的任务,在当前进程中不关心发送邮件的结果,直接往下执行
正在运行的进程因为提出系统服务请求(如I/O操做),但由于某种缘由未获得操做系统的当即响应,或者须要从其余合做进程得到的数据还没有到达等缘由,该进程只能调用阻塞原语把本身阻塞,等待相应的事件出现后才被唤醒。
正在进行的进程因为发生某事件而暂时没法继续执行时,便放弃处理机而处于暂停状态,亦即进程的执行受到阻塞,咱们把这种暂停状态叫阻塞进程阻塞,有时也成为等待状态或封锁状态。一般这种处于阻塞状态的进程也排成一个队列。有的系统则根据阻塞缘由的不一样而处于阻塞状态进程排成多个队列。
例如:
用户访问服务端,请求用户的我的的订单信息,因为数据库数据量大,数据库繁忙,sql语句查询了3秒才返回,这个查询数据库的过程,就是可称为是"阻塞的".(进程调用外部逻辑)
阻塞这个概念和时间关系不大,就算查了0.1秒,也能够说是阻塞了0.1秒,由于这个并非进程自己执行所消耗的时间,而是由于查询数据库,等待数据库响应消耗的时间. 但阻塞的危害性和时间有关,阻塞0.1秒对于用户是没有任何问题的,可是阻塞10秒将会使用户体验降低不少,因此咱们须要重视阻塞
用户访问服务端,因为某个地方调用了死循环或多重循环浪费了许多时间,没法继续往下执行,这个状态也可称为阻塞.(非进程阻塞,可自行避免)
非进程阻塞 在进程阻塞层面中,并不算是被阻塞了,由于它依旧在执行进程中的代码,没有等待清空
如上所说,调用数据库等外部逻辑,形成阻塞的函数,就叫作阻塞函数
在php初级开发者中,或许没有听过这个概念,阻塞每每是和"同步"概念一块儿存在的,例如查询数据库,获取文件数据,请求其余网站,等等,只要须要消耗非进程自己执行时间并须要进程等待(同步)的,均可以说是阻塞.
几乎全部的阻塞,都是与I/O有关.
阻塞必定是同步代码调用阻塞函数才会阻塞,但同步代码不必定会阻塞(不调用阻塞函数的同步代码)<?php $num = 30; $result = M('test')->select();//伪代码,sql阻塞 sleep(3);//伪代码,当成执行了3秒才返回 echo json_encode($result);//返回数据
可自行搜索了解更多
非阻塞,顾名思义,就是在进程在运行中,不存在阻塞状况,一直能往下执行.
非阻塞通常是指调用I/O操做时,进程无需等待I/O操做,直接往下执行的状况 非阻塞一般是和"异步"概念一块儿存在,只要是异步获取I/O,就必定是非阻塞
异步调用I/O必定是非阻塞的,但非阻塞不必定须要异步调用才可实现(非阻塞模型)
例如:
当查询数据库时,立刻返回状态(查询到了就返回数据,数据还没到就返回-1),程序能够当即往下执行逻辑.
这种立刻返回结果,无需等待(并不必定有数据)的函数,就叫作非阻塞函数,也可称为是"异步调用"
能够经过非阻塞模型去实现非阻塞(主要针对于server服务端实现). 详细了解可查看:http://www.php20.cn/article/157
php初级开发者中,不多有非阻塞这个概念存在,但php是有非阻塞的,例如socket_set_nonblock()函数,将socket改成非阻塞状态
经过flock($file,LOCK_EX|LOCK_NB),可将文件操做设置为非阻塞状态
可自行搜索了解详细
因为非阻塞的返回结果是不肯定的,当咱们须要关心返回结果的状况时,须要确保返回结果是正确的(例如while(1){}定时查询,当数据正确返回退出循环),或者直接使用阻塞函数
阻塞:
小明去电脑店买Mac,问店员如今有没有MacBook Pro版本,有多少台,店员告诉小明,"我得去查一查,你得等等",小明站在店门口等了2天,店员回来了,告诉小明,如今有10台,而后小明买了一台.
在这个过程当中,店员查询是否有mbp的动做,就属于I/O操做,叫小明等等这个操做,就是阻塞状况,小明等了2天,就说明查询mbp时间为2天,阻塞了2天,店员回来告诉小明有10台,就是阻塞函数出现告终果,并返回了数据,小明买了一台,就是继续往下执行了代码
非阻塞: 小明去电脑店买Mac,问店员如今有没有MacBook Pro版本,有多少台,店员告诉小明,"我得去查一查,你先回去呗",小明回家,每隔10分钟打电话给店员,可是店员每次都告诉他还没查到,小明每次打完电话就去敲PHP代码,2天后,小明打完一把LOL,又打电话给店员问,店员告诉小明,如今有10台了,而后小明买了一台.
在这个过程当中,店员查询是否有mbp的动做,就属于I/O操做,叫小明回家这个操做,就是非阻塞状况,小明不断打电话,这个就是定时轮询查询,店员不断的回复,这个状况就是非阻塞函数没有返回数据,小明去敲PHP,说明非阻塞状况还能执行其余代码,2天后,店员回来告诉小明有10台,就是非阻塞函数经过轮询出现告终果,并返回了数据,小明买了一台,就是退出了循环继续往下执行了代码