php 多线程pthreads官网翻译

news/2024/12/26 18:28:43

不分享,做一切!

php拥有令人敬畏的且数量庞大的扩展跟特征,但是php当初设计这门语言的时候,是因为那个时候的web网站远远没有今天的强大!现在几乎所有的网站(含手机站)服务器都是多核的,如果不是多CPU跟多核,PHP是无法提供更好的服务的。虽然PHP正在非常迅速的展示及表达你的想法,但是当我们想要通过成熟的语言或者框架,建设更加完善的网页应用(网站)或者是数据库驱动的应用,因为PHP不能够让我们更好的支配硬件服务器。所以比较尴尬!但是多线程让PHP创建更完善【牛叉】的应用成为可能,这个特征是的你的个人网站能够做到一些以前不能够做到的事情!

基础

pthreads 扩展是一个专有的API,它可以让用户在PHP语言里面使用多线程。它包含了你创建多线程应用的全部工具,当然无论是web、还是控制台程序。
PHP程序可以创建、读取、写入及同步线程操作,含如下类型:Threads、Workers、Stackables【翻译者注释:V2 以上的版本 同 Threaded】。

Thread对象

用户可以通过继承Thread类来使用线程,当然这个类是通过pthreads拓展实现的。任何成员【函数/代码段/继承者】都可以通过引入线程类来读取及重写这个线程类的方法。任何继承于线程的程序,都可以执行任何的公开的及受保护的线程程序。当我们在程序中调用线程类里面的start方法的时候,线程类【继承线程类的子类】中的run方法将会作为一个独立的线程被执行。只有当上下文程序创建一个线程,并且开启start方法及join方法的时候。【翻译者注释:如果使用join 就是等待上一个线程结束,然后执行下一个线程,官方给的说明是同步】

Worker对象

Worker线程拥有持久的稳定性,表现在当这个线程创建及开启后是一直可用的,除非这个线程的引用超出了范围,也就是线程实例消失了。或者主动调用shutdown方法关闭了。任何在程序中使用Worker类及子类实例化的对象,当程序独立运行为一个独立线程时,这个Worker里面的run方法相对与存在Worker对象栈里面的其它程序,run方法将最先被调用。这样的话,这个run方法就可以用来初始化一些资源,方便后面栈中程序调用。【翻译者注释:注意在Workder对象里面stack方法内调用的其它线程的实例化会被执行,但是不是单独产生新的线程。只有Worker此时会单独产生线程,因为并没有调用其它线程的start方法】【脚本执行完成,这个Worker也会挂掉的。】

Stackable对象

栈排序【Stackable】对象在运行run方法期间可以读写及执行Worker线程,此外,任何继承于Stackable线程的子程序或者程序段,都可以读写或者执行它的自己的方法在线程执行前或者执行后。【翻译者注释:应该跟 Worker线程里面的 Stack相关吧。因为在最新的里面pthreads v3版本里面的没有Stackable类了,相关可以替换的应该是 threaded 类,感觉 threaded是最大的基类,然后 thread是子类,然后worker是 thread的子类】

同步

所有的pthreads对象可以通过::wait()及::notify()方法来构建线程同步,在子程序【程序段】中调用::wait()方法将会让线程等待执行,当调用::notify()方法将会唤起::wait()方法继续执行线程。这样就可以允许强大的线程PHP线程同步。

等等,什么是Threaded对象?

其中 Stackable、Thread、Worker可以被认为是Threaded的子类,Threaded可以认为是标准基础类。所以上述的类都具备基类的全部属性及方法。

任何想要应用在程序里面的多线程应用必须都是继承于Stackable、Thread、Worker这几个实用类【v3 以上版本 取消了 Stackable类】。这也就意味这每个子类都会天然具备run方法,但是不一定使用它【翻译者注释:因为run方法是在threaded这个最大的基类里面的,当然每个子类都有了】。这个threaded类经常会被实例化来进行真正的程序运算。也就是说,任何线程子程序都可以运行threaded的成员属性及函数,在运行前、中、后时期。

方法修饰符

在pthreads线程扩展中的Threaded类中的受保护[protected]的方法,意味着同一时间内之内有一个线程调用这个方法。threaded类中私有[prvate]方法,意味着只能在线程运行中进行调用【也就是:创建该线程的对象调用】。【翻译者注释:默认的threaded类里面的方法都是public的,用户需要自己添加受保护和私有的方法】

数据存储

作为首要原则,任何可以被序列化的数据都可以作为类成员属性进行存储【翻译者注释:类似于定义了魔术方法,对不存在的属性进行存取】,它能够在子类实例化的任何位置进行读写操作。不是所有的数据都会被序列化的,基础的类型将会存储相应的真实表单中。复杂的类型,如数组 和对象【非线程对象】才会被序列化后存储。存储完成后,就可以在任何使用该线程的位置进行读取操作。
甚至如下特殊情况,就是线程对象作为另一个线程的成员属性时候被引用的时候,同样的数据读取特性是一样的。

资源

这些扩展跟函数在PHP定义【请求】了一定的被占用的资源,pthreads会提供线程之间的资源共享【连接使用】,但是这些资源将会产生问题,绝大多数时间,资源是不应该在不同的线程中间共享的,更应该像是流或者sockets的方式管理资源。一般情况下,资源持久占用是不被支持的。

进击的的扩展:
pthreads扩展试图获取一个完整的结果。它的局限性及特征将会随时改变。这个是非常自然的。它的这些局限性通常都是通过继承强加的,虽然都是处于善意。pthreads 的目标就是提供可用的、多任务的、任何级别的、PHP解决方案,在这样的环境下pthreads诞生了,一些限制非常的必要,就是为了给大家提供一个稳定的环境!请大家谅解!【翻译者注释:最后那句我加的!】

牛叉!

多线程官网:
http://pthreads.org/

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。互联网+时代,时刻要保持学习,携手千锋PHP,Dream It Possible。


http://www.niftyadmin.cn/n/707420.html

相关文章

嘉善 机器人比赛_第十一届省青少年机器人大赛嘉善摆擂

比赛现场。看,小选手多专心!乒乓球桌大小的赛桌上,两队机器人朝着小足球飞奔而去,砰砰砰地相互撞成了一团。这些踢足球的机器人形状很像小圆凳,头上都顶着个空可乐瓶,肚子里的仪器和电线缠缠绕绕——它们是…

java 数据类型 存储_java中的基本数据类型一定存储在栈中吗?

首先说明,"java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的。下面让我们一起来分析一下原因:基本数据类型是放在栈中还是放在堆中,这取决于基本类型在何处声明,下面对数据类型在内存中的存储问题来…

android购物车遇到的问题

近期 做购物车的时候 ,遇到几个问题。如今 总结例如以下: 1:不让listview复用组件(购物车。或者有特殊操作的时候): 自己保存全部的view对象 public View getView(final int position, View convertView, ViewGroup parent) {fina…

java 通用数组_如何在Java中创建通用数组?

由于Java泛型的实现,因此不能有以下代码:public class GenSet {private E a[];public GenSet() {a new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation}}如何在保持类型安全的同时实现此目的?我在Java论坛上看到了这样的解决方…

荒野大镖客2云存储失败_荒野大镖客2天气系统云雾分帧处理细节

在荒野大镖客2分享在SIGGRAPH2019的文章里面有几张PPT是关于云雾是怎么优化Raymarch效率的,我先按照我的理解说一遍到底这几页PPT在讲什么。首先是告诉我们因为体素不能表现很多高频细节,所以从体素的远端开始要进行视口的Raymarch,然而全分辨…

java注释工具_Java注释和javadoc工具

本篇文章分为两部分:注释(基础)和注释(进阶)。在注释(基础)部分,主要讲述注释的概念、类别、写注释的规范、细节和作用;在注释(进阶)部分,主要讲使用javadoc开发工具生成一个开发者文档。内容概览:注释基础注释的概念注…

LoadRunner监控图表与配置(二)监控运行状况和交易状况

1、在左侧Available Graphs视图中展开Runtime Graphs节点,选择其中一种类型添加至控制器运行标签的界面。 2、在图中显示的空白区域点击右键,在弹出的快捷菜单中选择configure选项,弹出如下图表配置窗口。设置完成后点击“OK”,更改的图表属性…

配送区域是什么意思_Wish卖家如何进行配送设置

本文将向你介绍Wish的配送体系,包括配送政策、运费设置,和关于配送设置的小技巧。关于配送亲爱的Wish商户,在店铺维度上,你可选择以下三种配送范围之一:仅配送至美国、全球配送或配送至选定国家。快速可靠的产品配送是…