精华内容
下载资源
问答
  • 我也相信还是有部分小伙伴在初级开发阶段...同步:大家都知道程序的执行是从上而下的,就像我们平时开发的程序也就是一条线,这样的程序就称为同步。举个简单的例子来说明一下(用程序实现一个下单流程)用户提交订单...

    我也相信还是有部分小伙伴在初级开发阶段确实没有太过于关注这个概念?这就说下我的理解!

    先科普下IO:(IO)是input和output的缩写,这个词在很多地方都会出现,是什么不用多解释,通常被称为:输入(写),输出(读)。通常就被称为:读写!

    同步:大家都知道程序的执行是从上而下的,就像我们平时开发的程序也就是一条线,这样的程序就称为同步。

    举个简单的例子来说明一下(用程序实现一个下单流程)

    用户提交订单数据->处理数据->调用支付接口->将订单数据保存到数据库->完成支付

    用代码实现也就是一步一步的处理,到支付结束为止,这样的代码就是同步代码!

    阻塞(同步程序的执行过程的IO等待就被称为阻塞)

    正是大家看到的,同步的代码就像是单点操作,需要一步一步的执行下去才能达到目的,那么就需要等待程序从头跑到尾的执行时间,这个执行时间包含了数据运算处理,读写数据库,就比如我们下单过程,我们需要查询数据库订单是否已经存在(读)、要将订单数据保存到数据库(写),程序必须等到读写成功了再执行下一步,在这个等待读写的过程通常就被称为阻塞。通常同步程序都伴随着阻塞,而在PHP程序中不支持多进程,那么并发高的情况下,处理起来必定捉襟见肘了。

    那么如何解决阻塞带来的问题?

    所以高并发的情况下就引入了redis、消息队列(MQ)、如果能够使用多进程处理也是一个不错的方案,swoole的诞生,我觉得同步程序并发也将不是痛点。

    说了同步接下来我们说下下异步?

    异步:简单来说就是不需要等待而又完成了同步的事情就被称为异步这个不是所有场景都适用。

    下面我们也举一个简单的例子说明一下,我们有一个发送10万条邮件的需求,如果我们使用同步模式,需要发送一封邮件之后才能发送第二封,到10万封也不知道要等待几个日日夜夜了,这样异步的概念就产生了,我先创建一个发送的任务(也就是要把发送的内容和地址存到数据库),后来再写程序让他自动的去发送邮件,这样的程序就被称为异步。

    异步的优点:可以很大程度上提升IO,异步程序很大程度上提高了用户体验,异步可以开启多进程处理,swoole 的出现,让PHP的性能可以说能够实现一个飞跃性的成长。

    异步的缺点:并不是所有的程序都适合使用异步,而且异步创建进程会有很大的开销,滥用异步反而影响性能。

    我就简单的说这么多,我不是给s wo o le打广告,不过是s wo o le是PHP开发工程师进阶之路的一个大机缘。虽然我也没有研究透彻,但是希望我们一起来学习他,使用它,并且能够在项目中去实践,真正的提升开发效率!

    展开全文
  • 如何理解PHP同步阻塞、和异步IO?

    千次阅读 2019-09-23 15:34:39
    至于为什么要写这篇文章,是因为在近日有个小伙伴突然问我,什么是同步?什么是异步?概念是什么?如何理解? 我也相信还是有部分小伙伴在初级开发阶段确实没有太过于关注这个概念?这就说下我的理解! 先科普下...

    至于为什么要写这篇文章,是因为在近日有个小伙伴突然问我,什么是同步?什么是异步?概念是什么?如何理解?

     

    我也相信还是有部分小伙伴在初级开发阶段确实没有太过于关注这个概念?这就说下我的理解!

    先科普下IO:(IO)是input和output的缩写,这个词在很多地方都会出现,是什么不用多解释,通常被称为:输入(写),输出(读)。通常就被称为:读写!

     

    同步:大家都知道程序的执行是从上而下的,就像我们平时开发的程序也就是一条线,这样的程序就称为同步。

     

    举个简单的例子来说明一下(用程序实现一个下单流程)

     

    用户提交订单数据->处理数据->调用支付接口->将订单数据保存到数据库->完成支付

    用代码实现也就是一步一步的处理,到支付结束为止,这样的代码就是同步代码!

     

    阻塞(同步程序的执行过程的IO等待就被称为阻塞)

    正是大家看到的,同步的代码就像是单点操作,需要一步一步的执行下去才能达到目的,那么就需要等待程序从头跑到尾的执行时间,这个执行时间包含了数据运算处理,读写数据库,就比如我们下单过程,我们需要查询数据库订单是否已经存在()、要将订单数据保存到数据库(),程序必须等到读写成功了再执行下一步,在这个等待读写的过程通常就被称为阻塞。通常同步程序都伴随着阻塞,而在PHP程序中不支持多进程,那么并发高的情况下,处理起来必定捉襟见肘了。

     

    那么如何解决阻塞带来的问题?

    所以高并发的情况下就引入了redis、消息队列(MQ)、如果能够使用多进程处理也是一个不错的方案,swoole的诞生,我觉得同步程序并发也将不是痛点。

     

    说了同步接下来我们说下下异步?

     

    异步:简单来说就是不需要等待而又完成了同步的事情就被称为异步这个不是所有场景都适用。

     

    下面我们也举一个简单的例子说明一下,我们有一个发送10万条邮件的需求,如果我们使用同步模式,需要发送一封邮件之后才能发送第二封,到10万封也不知道要等待几个日日夜夜了,这样异步的概念就产生了,我先创建一个发送的任务(也就是要把发送的内容和地址存到数据库),后来再写程序让他自动的去发送邮件,这样的程序就被称为异步。

     

    异步的优点:可以很大程度上提升IO,异步程序很大程度上提高了用户体验,异步可以开启多进程处理,swoole 的出现,让PHP的性能可以说能够实现一个飞跃性的成长。

     

    异步的缺点:并不是所有的程序都适合使用异步,而且异步创建进程会有很大的开销,滥用异步反而影响性能。

     

    展开全文
  • 并发 IO 问题一直是服务器端编程中的技术难题,从最早的同步阻塞直接 Fork 进程,到 Worker 进程池/线程池,到现在的异步IO、协程。PHP 程序员因为有强大的 LAMP 框架,对这类底层方面的知识知之甚少,本文目的就是...

    92e1be6046f19a813c4505b503279fa1.png

    并发 IO 问题一直是服务器端编程中的技术难题,从最早的同步阻塞直接 Fork 进程,到 Worker 进程池/线程池,到现在的异步IO、协程。PHP 程序员因为有强大的 LAMP 框架,对这类底层方面的知识知之甚少,本文目的就是详细介绍 PHP 进行并发 IO 编程的各种尝试,最后再介绍 Swoole 的使用,深入浅出全面解析并发 IO 问题。

    多进程/多线程同步阻塞

    最早的服务器端程序都是通过多进程、多线程来解决并发IO的问题。进程模型出现的最早,从 Unix 系统诞生就开始有了进程的概念。最早的服务器端程序一般都是 Accept 一个客户端连接就创建一个进程,然后子进程进入循环同步阻塞地与客户端连接进行交互,收发处理数据。

    5a7fd006b962b.png

    多线程模式出现要晚一些,线程与进程相比更轻量,而且线程之间是共享内存堆栈的,所以不同的线程之间交互非常容易实现。比如这样的程序,客户端连接之间可以交互,比中的玩家可以任意的其他人发消息。用多线程模式实现非常简单,线程中可以直接向某一个客户端连接发送数据。而多进程模式就要用到管道、消息队列、共享内存,统称进程间通信(IPC)复杂的技术才能实现。

    代码实例:

    5a7fd02218081.png

    多进程/线程模型的流程是

    创建一个 socket,绑定服务器端口(bind),端口(listen),在PHP中用stream_socket_server一个函数就能完成上面3个步骤,当然也可以使用更底层的sockets扩展分别实现。

    进入while循环,阻塞在accept操作上,等待客户端连接进入。此时程序会进入睡眠状态,直到有新的客户端发起connect到服务器,操作系统会唤醒此进程。accept函数返回客户端连接的socket

    主进程在多进程模型下通过fork(php: pcntl_fork)创建子进程,多线程模型下使用pthread_create(php: new Thread)创建子线程。下文如无特殊声明将使用进程同时表示进程/线程。

    子进程创建成功后进入while循环,阻塞在recv(php: fread)调用上,等待客户端向服务器发送数据。收到数据后服务器程序进行处理然后使用send(php: fwrite)向客户端发送响应。长连接的服务会持续与客户端交互,而短连接服务一般收到响应就会close。

    当客户端连接关闭时,子进程退出并销毁所有资源。主进程会回收掉此子进程。

    这种模式最大的问题是,进程/线程创建和销毁的开销很大。所以上面的模式没办法应用于非常繁忙的服务器程序。对应的改进版解决了此问题,这就是经典的 Leader-Follower 模型。

    9db07947a192b8bc420841f376c05a3b.png

    代码实例:

    5a7fd03892cd6.png

    它的特点是程序启动后就会创建N个进程。每个子进程进入 Accept,等待新的连接进入。当客户端连接到服务器时,其中一个子进程会被唤醒,开始处理客户端请求,并且不再接受新的TCP连接。当此连接关闭时,子进程会释放,重新进入 Accept ,参与处理新的连接。

    这个模型的优势是完全可以复用进程,没有额外消耗,性能非常好。很多常见的服务器程序都是基于此模型的,比如 Apache 、PHP-FPM。

    多进程模型也有一些缺点。

    这种模型严重依赖进程的数量解决并发问题,一个客户端连接就需要占用一个进程,工作进程的数量有多少,并发处理能力就有多少。操作系统可以创建的进程数量是有限的。

    启动大量进程会带来额外的进程调度消耗。数百个进程时可能进程上下文切换调度消耗占CPU不到1%可以忽略不接,如果启动数千甚至数万个进程,消耗就会直线上升。调度消耗可能占到 CPU 的百分之几十甚至 100%。

    另外有一些场景多进程模型无法解决,比如即时聊天程序(IM),一台服务器要同时维持上万甚至几十万上百万的连接(经典的C10K问题),多进程模型就力不从心了。

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/ruanjian/article-72051-1.html

    展开全文
  • js同步阻塞Update Oct 2013: for a more bulletproof version, tested in the wild, IE and all, check Philip's snippet at http://www.lognormal.com/blog/2012/12/12/the-script-loader-pattern/ 2013年10月更新...
    js同步阻塞

    js同步阻塞

    Update Oct 2013: for a more bulletproof version, tested in the wild, IE and all, check Philip's snippet at http://www.lognormal.com/blog/2012/12/12/the-script-loader-pattern/

    2013年10月更新:要获得在野外,IE和所有环境中经过测试的更防弹的版本,请访问http://www.lognormal.com/blog/2012/12/12/the-script-loader-pattern检查Philip的代码段/

    Asynchronous JS is cool but it still blocks window.onload event (except in IE before 10). That's rarely a problem, because window.onload is increasingly less important, but still...

    异步JS很酷,但是它仍然阻止window.onload事件(IE 10之前的版本除外)。 这很少出现问题,因为window.onload重要性越来越小,但仍然...

    At my Velocity conference talk today Philip "Log Normal" Tellis asked if there was a way to load async JS without blocking onload. I said I don't know, which in retrospect was duh! because I spoke about Meebo's non-onload-blocking frames (without providing details) earlier in the talk.

    在今天的Velocity会议演讲上,Philip“ Log Normal ” Tellis询问是否有一种加载异步JS而不阻止onload 。 我说我不知道​​,回想起来是哪! 因为我在演讲开始时谈到了Meebo的非阻塞框架(未提供详细信息)。

    Stage fright I guess.

    我猜是怯场。

    Minutes later in a moment of clarity I figured Meebo's way should help. Unfortunately all Meebo docs are gone from their site, but we still have their Velocity talk from earlier years (PPT). There are missing pieces there but I was able to reconstruct a snippet that should load a JavaScript asynchronously without blocking onload.

    几分钟后,我想了一下Meebo的方法应该会有所帮助。 不幸的是,所有Meebo文档都已从他们的站点中删除,但是我们仍然有他们早些时候的Velocity演讲( PPT )。 那里缺少一些片段,但是我能够重建一个片段,该片段应异步加载JavaScript而不阻止onload。

    Here it goes:

    它去了:

    (function(url){
      var iframe = document.createElement('iframe');
      (iframe.frameElement || iframe).style.cssText = "width: 0; height: 0; border: 0";
      var where = document.getElementsByTagName('script');
      where = where[where.length - 1];
      where.parentNode.insertBefore(iframe, where);
      var doc = iframe.contentWindow.document;
      doc.open().write('<body onload="'+
        'var js = document.createElement(\'script\');'+
        'js.src = \''+ url +'\';'+
        'document.body.appendChild(js);">');
      doc.close();
    })('http://www.jspatterns.com/files/meebo/asyncjs1.php');
    

    The demo page is right here. It loads a script (asyncjs1.php) that is intentionally delayed for 5 seconds.

    演示页面就在这里。 它加载一个脚本( asyncjs1.php ),该脚本被故意延迟了5秒钟。

    特征 (Features)

    • loads a javascript file asynchronously

      异步加载JavaScript文件
    • doesn't block window.onload nor DOMContentLoaded

      不阻止window.onloadDOMContentLoaded

    • works in Safari, Chrome, Firefox, IE6789 *

      适用于Safari,Chrome,Firefox,IE6789 *
    • works even when the script is hosted on a different domain (third party, CDN, etc), so no x-domain issues.

      即使脚本托管在其他域(第三方,CDN等)上,该脚本也可以工作,因此没有x域问题。
    • no loading indicators, the page looks done and whenever the script arrives, it arrives and does its thing silently in the background. Good boy!

      没有加载指示器,页面看起来完成,并且每当脚本到达时,它就会到达并在后台静默地执行其操作。 好孩子!

    * The script works fine in Opera too, but blocks onload. Opera is weird here. Even regular async scripts block DOMContentLoaded which is a shame.

    *该脚本在Opera中也能正常工作,但是会阻止onload 。 歌剧在这里很奇怪。 甚至常规的异步脚本也会阻止DOMContentLoaded ,这很可惜。

    退税 (Drawback)

    The script (asyncjs1.php) runs is in an iframe, so all document and window references point to the iframe, not the host page.

    脚本(asyncjs1.php)运行在iframe中,因此所有documentwindow引用均指向iframe,而不是宿主页面。

    There's an easy solution for that without changing the whole script. Just wrap it in an immediate function and pass the document object the script expects:

    有一个简单的解决方案,无需更改整个脚本。 只需将其包装在一个立即函数中,然后传递脚本期望的document对象:

    (function(document){
     
      document.getElementById('r')... // all fine
     
    })(parent.document);
    

    它是如何工作的 (How does it work)

    1. create an iframe without setting src to a new URL. This fires onload of the iframe immediately and the whole thing is completely out of the way

      创建iframe而不将src设置为新的网址。 这会立即触发iframe的onload ,整个过程完全无法进行

    2. style the iframe to make it invisible

      设置iframe的样式以使其不可见
    3. get the last script tag so far, which is the snippet itself. This is in order to glue the iframe to the snippet that includes it.

      获取到目前为止的最后一个script标记,即代码片段本身。 这是为了将iframe粘贴到包含它的代码段。

    4. insert the iframe into the page

      将iframe插入页面
    5. get a handle to the document object of the iframe

      获取iframe document对象的句柄

    6. write some HTML into that iframe document

      将一些HTML写入该iframe文档
    7. this HTML includes the desired script

      该HTML包含所需的脚本

    Tell your friends about this post on Facebook and Twitter

    FacebookTwitter上告诉您的朋友有关此帖子的信息

    翻译自: https://www.phpied.com/non-onload-blocking-async-js/

    js同步阻塞

    展开全文
  • 最近做一个项目,遇到了一个问题同步ajax引起的ui线程阻塞问题,下面把我的问题解决过程分享给大家。 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我封装了一个名为getData...
  • 同步阻塞与异步非阻塞适用场景

    千次阅读 2017-04-21 17:01:15
    异步的优势高并发,同步阻塞IO模型的并发能力依赖于进程/线程数量,例如 php-fpm开启了200个进程,理论上最大支持的并发能力为200。如果每个请求平均需要100ms,那么应用程序就可以提供2000qps。异步非阻塞的并发...
  • 阻塞阻塞 同步异步

    2020-05-27 14:23:06
    同步阻塞) 老张觉得自己有点傻 2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞) 老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的...
  • 本文讲的是浅谈socket同步和异步、阻塞和非阻塞、I/O模型_php技巧, 在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式 同步/异步主要针对C端: 同步:c端发出一个功能...
  • 阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。 1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 所谓...
  • php阻塞访问url代码: function fsockopen_curl($hostname, $url){ $fp = fsockopen($hostname, 80, $errno, $errstr, 5); if (!$fp) { echo "$errstr ($errno)"; return false; }
  •  在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步:  所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一
  •  在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步:  所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事...
  • php 服务端 s.php //创建Server对象,监听 0.0.0.0:9501端口 $serv = new Swoole\Server("0.0.0.0", 9501); //监听连接进入事件 $serv->on('Connect', function ($serv, $fd) { echo "Client: Connect.\n";...
  • 同步 同步代码主要是指调用某个逻辑时,会等待到该逻辑返回调用结果.例如: <?php $num = 30; $result = M('test')->select();//伪代码,查询数据库 sleep(3);//伪代码,当成执行了3秒才返回 echo json_...
  • 1同步。异步: https: //www .cnblogs .com /Anker/p/ 5965654. html 2 nginx为什么比apache快? https: //blog .csdn .net /zp17764507932/article/details/ 53667303
  • 聊聊同步、异步、阻塞与非阻塞 近来遇到了一些常见的概念,尤其是网络编程方面的概念,如:阻塞、非阻塞、异步I/O等等,对于这些概念自己也没有太清晰的认识,只是很模糊的概念
  • 四、同步、异步、阻塞与非阻塞 4.1、引言 近来遇到了一些常见的概念,尤其是网络编程方面的概念,如:阻塞、非阻塞、异步I/O等等,对于这些概念自己也没有太清晰的认识,只是很模糊的概念,说了解吧也了解,但是要...
  • 1. 概念理解 ... 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步:  所谓同步,就是在c端发出一个功能调用时
  • 问题由来题目来自某次面试题.怎么去回答这个问题要分清几个相似的概念,无非从以下三个方面着手: 1. 每个词官方解释是怎么样的? 2. 它们之间的区别?...非阻塞阻塞调用指在不能立刻得到结果之前,该调用不会阻
  • 同步阻塞加载js

    2009-06-28 00:25:57
    之前,实现WYSIWYG插件机制的时候为了实现lazy load,写了个同步阻塞加载js的方法,解决方法很暴力,仅供参考,,注意,只是个demo。。。 [code="html"] test var require = {}; ...
  • 阻塞和非阻塞 阻塞调用是指调用结果返回之前,调用者会进入阻塞状态等待。只有在得到结果之后才会返回。 非阻塞调用是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。   2.同步与异步 同步...
  • 同步阻塞:客户端发送请求给服务端,此时服务端处理任务时间很久,则客户端则被服务端阻塞了,所以客户端会一直等待服务端的响应,此时客户端不能做其他任何事,服务端也不会接受其他客户端的请求。这种通信机制比较...
  • http://www.cnblogs.com/wxl-dede/p/5134636.html同步异步,阻塞阻塞 和nginx的IO模型同步与异步同步和异步关注的是消息通信机制(synchronous communication/ asynchronous communication)。所谓同步,就是在发出一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,386
精华内容 10,154
热门标签
关键字:

php同步阻塞