stream_set_blocking让程序无阻塞
stream_set_blocking ($resource, $flag); $flag 取值为0或1
0是非阻塞,1是阻塞
阻塞的意义是什么呢?
某个函数读取一个网络流,当没有未读取字节的时候,程序该怎么办?
是一直等待,直到下一个未读取的字节的出现,还是立即告诉调用者当前没有新内容?
前者是阻塞的,后者是非阻塞的。
阻塞的好处是,排除其它非正常因素,阻塞的是按顺序执行的同步的读取。
借用小说里的说法就是“神刀出鞘,无血不归”。在读到新内容之前,它不会往下走,什么别的事情都不做。
而非阻塞,因为不必等待内容,所以能异步的执行,现在读到读不到都没关系,执行读取操作后立刻就继续往下做别的事情。
如果你不放心,可以过一定的时间再来检查执行的结果。之前我写过一个用popen pclose来让程序并发执行的例子。
当时的遗憾就是调用之后不管,所以没法知道程序是否执行成功了。现在popen之后设定为非阻塞模式,就可以创建一个数组作为任务池。
使用一个while(1)的“死循环”来检查当前任务池中各个任务的状态,有老任务执行完毕时,$status = stream_get_meta_data($resource);
状态值$status['eof']为真,就表示那个任务执行完毕了。我本次实现的程序功能比较单一,只需要知道它执行完毕就可以了。如果你的任务有多种结果,那就继续分析读取到的内容吧。发现有任务执行完毕,从任务池中剔除该任务,如果任务队列中还有未做的任务,就把新任务从队列中移到任务池中执行。
说的比较啰嗦,如果你用过网络蚂蚁或网际快车之类的下载软件,你会发现我讲的这些其实就是它们的工作原理。
ps:多进程异步抓取很爽啊。
分享到:
相关推荐
rtp_session_set_blocking_mode rtp_session_set_profile rtp_session_get_profile rtp_session_set_data rtp_session_signal_connect rtp_session_signal_disconnect_by_callback rtp_session_set_ssrc ...
Removal_of_blocking_and_ringing_artifacts_using_transform_domaindenoising
i upload the matlab code related to blocking probability in cellular systems
blocking the socket files with samples
实现数字移动通信中的阻塞率仿真,并将设置的不同参数的仿真图在同一窗口显示
产生问题自建邮局发邮件时提示错误信息:stream_set_blocking()...这是因为PHP 5.6+版本强制要求验证服务器的有效性Stream wra
实用、效率高的linux下消息队列程序,可以快速,方便的应用于linux线程间的通信
CUDA:主导GPU计算的革命 对CUDA在计算方面的讲解
集阻止 设置阻塞stdio和stderr确保终端输出不会截断。 const setBlocking = require ( 'set-blocking' )setBlocking ( true )console . log ( someLargeStringToOutput )历史背景/警告语创建它的目的是为了解决讨论...
演示用ATL编写的基于线程的TCP/IP通信控件
EventLoop组件 库可用于事件I / O的的核心React器事件循环。 为了使基于异步的库可互操作,它们需要使用相同的事件循环。 该组件提供任何库都可以定位的通用LoopInterface 。...stream_set_blocking (
agh_blocking_python自定义python应用程序可按用户阻止主机
The State of Peer_to_Peer Simulators and Simulations
blocking mode socket(阻塞模式socket-windows) 详细介绍请在csdn搜索“blocking mode socket”,是对此代码的介绍。
blocking probability versus new cell rate
stream_set_blocking( $fp , false ) 设置数据流为阻塞模式,以防止数据没读完就退出 如果模式为 false, 给定的 socket 描述符将切换到非块模式, 如果为 true, 则切换到块模式. 这个效果类似于 fgets() 从 ...
Blocking_pool 用于在异步应用程序中运行同步I / O的线程池。 在异步代码中,阻塞线程(即调用一些需要很长时间才能返回的函数)是一个非常糟糕的主意。 这将阻止所有其他异步任务运行,并可能导致各种不良行为。 ...
博主的博客Verilog之blocking & nonblocking assignments有些内容是参考了这篇英文文献的,其中对verilog中有关阻塞与非阻塞赋值语句的8种准则进行了详细的举例说明,读者可以下载文章进行详细阅读,以便更好地理解...
oracle RAC查看blocking的脚本
using select to implement socket multiplexing, and non-blocking, asynchronous IO