码农网永久会员升级指南:解锁所有视频教程,深入理解多线程技术
代码农业网络:

升级永久会员可以在网站上查看所有视频教程。
更改链接:
Nongwang代码的最新更新的视频教程如下:
文章
了解什么是多线程线程
线程(线程)是操作系统执行计算计划的最小单元。它包含在过程中,是该过程中的实际操作单元。一个线程是指该过程中的单阶控制流。可以在一个过程中发出多线程,并且每个线程并行执行以执行不同的任务。
多线程的使用主要是因为它在执行效率方面具有很大的优势。由于线程是操作系统安排的最小单元:
同时,与多进程程序相比,多线程具有以下特征:
适用的方案
有许多多线程优化,但是没有大脑的大脑的多次使用无法提高程序的执行效率,因为螺纹的创建和破坏,上下文切换,线程同步等也是性能损失。时间消耗可能超过执行订单的代码。诸如:sumsmall之类的本质是一个从1增加到50,000的函数。
上图是三次summall,三个线程在主线程中执行sumsmall,然后将结果的结果与线程进行比较。同步的时间远远大于线程的异步执行所节省的时间。
函数Sumlarge添加了1到50,000,与三个线程和三个线程执行相同线程相同的时间相同:
这次,多线程优势最终具有有效的优势。
是否使用多线程也需要根据特定需求确定。通常考虑以下两种情况:
PHP中的多线程
PHP不支持多线程默认值。要使用多线程Pthread扩展,需要Pthread扩展。您必须使用可启示的维修器-ZTS参数重新编译PHP。此参数是在编译PHP时使用线程安全方法。
线程安全性
多线程是使程序不安的因素。在使用多线程之前,首先考虑线程安全问题:
线程安全性:线程安全性是编程中的术语。这意味着,当可以在多线程环境中调用函数和功能库时,它可以正确处理多个线程之间的共享变量以纠正程序函数。
在传统的多线程中,由于多个线程共享变量,可能会出现以下问题:
1有一个全局数组$ arr = array('a');
2线A阵列的长度为1;
3线B的阵列的长度为1;
4一个线程弹出数组元素$ a = array_pop($ arr); $ a ='a';
5 B线程也弹出数组元素$ b = array_pop($ arr); $ a = null;
6目前,螺纹B中发生了一个精神事件。阵列的长度大于0,或者没有流行声。
PHP实施
PHP实现的线程安全性主要是使用TSRM机制来隔离全局变量和静态变量,并将全局变量和静态变量复制到每个线程。变量冲突后,将没有线程安全问题。
PHP的多线程包装可确保线程安全性。程序员无需考虑将各种锁添加到全局变量中即可避免读写冲突。同时,它们还减少了错误的机会。编写的代码更安全。
但是,结果,一旦子线程开始运行,主线程将无法再调整子线程操作的详细信息,并且该线程在一定程度上失去了通过全局变量传输消息传输的能力。
同时,在PHP启动线程安全选项后,分配和使用TSRM机制的变量将会有其他损失。因此,在不需要多个线程的PHP环境中,请使用PHP ZTS(非线程安全)版本。
类别和方法
PHP将线程封装到线程类中。线程的创建由实例化线程对象实现。由于类的封装,变量的使用只能通过构造函数传递,并且线程计算结果也需要通过类变量熄灭。
这是几种常用的线程类方法:
由于实现线程安全性,在PHP的多线开始运行之后,不再有可能通过共享内存空间进行通信,并且无法通过线程通信重复使用该线程。因此,我认为PHP的“线程池”没有意义。扩展名附带的池类类是由多线程分布管理的类,此处不会在此处介绍。
实例代码
以下是一个线程类,请求特定端口。接下来,基于它编写两个多线程应用程序示例:
class Request extends Thread {
public $url;
public $response;
public function __construct($url) {
$this->url = $url;
}
public function run() {
$this->response = file_get_contents($this->url);
}
}
异步请求
同步请求分为多个线程异步调用,以提高程序的运行效率。
$chG = new Request("www.google.com");
$chB = new Request("www.baidu.com");
$chG ->start();
$chB ->start();
$chG->join();
$chB->join();
$gl = $chG->response;
$bd = $chB->response;
加班控制
有时,我发现公司网页上的一件内容有时没有。我不知道如何实现它,但这给了我使用多线程的灵感:使用线程异步来实现快速失败和加班控制。
当我们使用curl请求地址时,我们可以设置curl连接超时时间,并通过curlopt_connectimeout / curlopt_timeout参数读取数据超时,但是总超时时间不容易控制。并且无法设置数据库查询的超时时间。
目前,我们可以使用多线程来实现此功能:线程类的start()方法之后,join()方法未调用,因此线程始终是异步的,并且不会阻止执行主线程。
目前,主线程相当于旗舰,子线等同于游轮。旗舰到达某个地方后,不必等待游轮返回。等待一段时间后,您可以在游轮事故发生时避免旗舰。
代码:
$chG = new Request("www.google.com");
$chB = new Request("www.baidu.com");
$chG->start();
$chB->start();
$chB->join();
// 此处不对chG执行join方法
sleep(1); // sleep一个能接受的超时时间
$gl = $chG->response;
$bd = $chB->response;
$bd->kill();
if (!$gl) {
$gl = ""; // 处理异常,或在线程类内给$gl一个默认值
}
总结
多线程的PHP密封(YAN)安装(GE)使人们使用线程非常不一致。尽管它是安全的,但它还保持了PHP的一致风格简单易用,但是不可能完全发挥多线程的能力。但是,每种语言都有其自身的特征和重点,并且无需强迫它。如果你爱她
以上是文章的所有内容。需要学习和体验交流或进入微信交换小组以学习和与交流交流的朋友。让我们一起学习,一起解决问题,并共同取得进步!前提是您正在学习技术。