提到php多线程,网上的例子基本都是并发发起http请求,难道php多线程就只能干这个吗,搞笑。
于是,我写了一个使用多线程对100万个数的排序,在测试的过程中发现了几个问题,记录一下。

php多线程只有在实例化的时候有机会传入参数,于是,当我传入数组的时候,发现有点不对劲。

class Test extends Thread{public $data;public $response;public function __construct($fruit){var_dump($fruit);$this->data = $fruit;var_dump($this->data);}public function run(){}
}$fruit = ['apple', 'balana', 'orange'];$p = new Test($fruit);
$p->start();

var_dump($p); // 为了查看线程是否还在,如果线程内有错误的话,线程就会被 destroy

结果:

array(3) {[0]=>string(5) "apple"[1]=>string(6) "balana"[2]=>string(6) "orange"
}
object(Volatile)#2 (3) {[0]=>string(5) "apple"[1]=>string(6) "balana"[2]=>string(6) "orange"
}
object(Test)#1 (2) {["data"]=>object(Volatile)#2 (3) {[0]=>string(5) "apple"[1]=>string(6) "balana"[2]=>string(6) "orange"}["response"]=>NULL
}

也就是说,在构造函数中,我传入数组,给属性赋值的时候,就变成了 Volatile 对象。
关于 Volatile 对象,查看官方文档:https://php.net/manual/en/class.volatile.php

2、修改run()方法

public function run(){$this->response = $this->data;}

结果:报错
也就说,只有构造函数中初始化的属性才配用上 Volatile 对象 。。。。。。

3、修改run()方法

public function run(){$this->data= null;}

结果:报错
PHP Fatal error: Uncaught RuntimeException: Threaded members previously set
to Threaded objects are immutable, cannot overwrite data

也就说,构造函数中初始化的属性还不能改动它。。。。。。。。。

4、修改run()方法

public function run(){$this->response = (array)$this->data;var_dump($this->response);}

结果:可行

array(3) {[0]=>string(5) "apple"[1]=>string(6) "balana"[2]=>string(6) "orange"
}
object(Test)#1 (2) {["data"]=>object(Volatile)#2 (3) {[0]=>string(5) "apple"[1]=>string(6) "balana"[2]=>string(6) "orange"}["response"]=>array(3) {[0]=>string(5) "apple"[1]=>string(6) "balana"[2]=>string(6) "orange"}
}

对于 Volatile 对象 ,懒得去研究,直接转数组就可以操作了啊。

5、修改run()方法

public function run(){$data = (array)$this->data;$data[5] = 55;$this->response = $data;
}

结果:报错,线程已终止
这就很无语了,莫名其妙嘛,于是尝试这 this−>response=(array)this->response = (array)this−>response=(array)data;
尼玛,这样可以,呵呵,没搞懂。

注意点:
1.线程类的属性不能直接进行哈希表(数组)操作,如:

//这样是无效的
$this->var1["hello"] = "world";
//改为
$this->var1 = ["hello"=>"world"];

因为线程类属性的赋值是通过序列化实现的,其本质是存储了序列化数据,因此不支持PHP常用直接操作哈希表(数组)的操作

2.线程类的属性不能是“闭包函数”
原因:闭包函数不能序列化;因此,如果想在线程里用“回调函数”的话,那就放弃线程吧;

3.线程对象开辟了php的第二空间
线程在创建之后,无法访问到父线程的变量,诸如$GLOBALS或global等用法都无法操作父线程的全局变量,这应该是考虑到了线程安全的问题;
但是父线程却能够访问子线程对象的内容;

4、传递数据库实例到线程里是无效的
传递进来的对象是好的,就是却无法执行数据库操作。建议还是在线程里去实例化数据库连接吧。

php多线程-传入数据到线程中相关推荐

  1. C#多线程开发-处理子线程中的异常

    C#多线程开发-处理子线程中的异常 在平时的多线程开发中,对于异常的处理是至关重要的,千万不能马虎.如果在实际的项目中,对于某些线程中的异常没有处理,会直接导致整个程序崩溃,软件无法使用. 其中需要说 ...

  2. 线程中如何使用对象_在 Flink 算子中使用多线程如何保证不丢数据?

    简介: 本人通过分析痛点.同步批量请求优化为异步请求.多线程 Client 模式.Flink 算子内多线程实现以及总结四部分帮助大家理解 Flink 中使用多线程的优化及在 Flink 算子中使用多线 ...

  3. 多线程面试题_线程,代码和数据–多线程Java程序实际运行的方式

    多线程面试题 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后您才意识到,这是我最想念的那几年,这是非常基本的. 了解多线程Java程序的执行方式就是其中之一. 您肯定已经 ...

  4. java8多线程运行程序_线程,代码和数据–多线程Java程序实际运行的方式

    java8多线程运行程序 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后才意识到,这是非常基本的事情,我为什么错过了这么多年. 了解多线程Java程序的执行方式就是其中之 ...

  5. 多线程、多平台环境中的跟踪 - 使用 log4j 和 UNIX 命令来挖掘跟踪数据

    2004 年 4 月 01 日 大多数 Java 程序员都使用某种跟踪系统来跟踪开发中的代码的潜在错误和问题.然而,多线程和多平台环境可能产生大量莫名其妙的跟踪数据.在本文中,软件工程师 Daniel ...

  6. 线程中这么调用类_一文学会 Python 多线程编程

    Threading 模块从Python 1.5.2版开始出现,用于增强底层的多线程模块 thread .Threading 模块让操作多线程变得更简单,并且支持程序同时运行多个操作. 注意,Pytho ...

  7. python协程怎么做数据同步_Python 中的进程、线程、协程、同步、异步、回调

    进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...

  8. Spring Boot 配置线程池使用多线程插入数据

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~个人原创+1博客:点击前往,查看更多 来源:h ...

  9. JavaFX 中使用多线程与保证 UI 线程安全

    JavaFX 中使用多线程与保证 UI 线程安全 JavaFX 中使用多线程 JavaFX 中保证 UI 线程安全 总结与补充   JavaFX 中的 UI 线程和大多数其它的编程语言一样,是单线程的 ...

最新文章

  1. 地理信息系统控件GIS控件TatukGIS Developer Kernel 下载及介绍
  2. 构建基于AgileEAS.NET应用开发平台的简单应用程序
  3. Codeforces-722C-Destroying Array(离线并查集)
  4. Jsoup之提交url
  5. 摊牌了,我靠它们成功实现了AI零基础入门到进阶!
  6. 计算机必记快捷键,电脑常用的快捷键,记住这些快捷键让你瞬间变成电脑高手...
  7. mean value coordinates
  8. 多进程服务器中,epoll的创建应该在创建子进程之后
  9. win10多合一原版系统_制作WIN10多合一原版系统工具下载
  10. 亚马逊平板刷机Linux系统,亚马逊平板刷机步骤是什么样的?
  11. 关于图像格式jpg、gif、png、svg、bmp、WebP的区别以及应用场景
  12. 如何理解Scala:迷之翻转喵 —— 协变逆变全解析
  13. 【创业】产品开发:什么是敏捷产品开发?
  14. NAT hairpin,端口回流,回环NAT
  15. 【檀越剑指大厂--mysql】mysql高阶篇
  16. winsxs探索之组件的本质:文件与注册表
  17. python爬取问卷星内容,Python 问卷星自动填写 爬虫
  18. 天池-金融风控训练营-task5-模型融合
  19. 零基础免费通过hexo+github快速搭建个人博客(超详细图解+B站视频讲解资源)
  20. ubuntu 12.04 下如何修改屏幕分辨率

热门文章

  1. C# treeview滚动条事件
  2. .net c# outlook发送邀请功
  3. plsql developer文件编码格式设置
  4. 用c语言程序画圣诞树,【图片】用C语言画一棵“圣诞树”(前方高能,学渣小心避让!)【广西科技大学吧】_百度贴吧...
  5. Android常用的网络权限,Android常用的权限大全
  6. CoinCola可盈可乐区块链行业周报第十一期(1.1-1.15)
  7. python之魔法方法
  8. vim: 根据编程语言自动选择不同的colorscheme
  9. WINXP VOL,VLK,FPP,RTM的含义
  10. php 二维数组 第一个,php二维数组排序几种方法