做多线程并发扩展,这两点你需要关注

死锁和线程安全是需要多加注意的两件事。
一、防止堵塞;必须打破四个条件。
例如,使用读写锁而不是互斥锁或一次分配所有资源。
其次,处理线程安全问题时,你必须自己做,因为Spring不保证bean线程安全。
无状态对象;所有局部变量和类不可变都是非常安全的。
您还必须选择正确的同步机制,例如ReentrantLock。
ThreadLocal可以帮助每个线程维护一个独立的副本。
最后,在实践中,线程池;生产者-消费者模型;信号量不要使用静态变量;性能优化必须继续。
总之,要想做好同步伸缩,一切都需要综合考虑。
你自己看看吧。

PHP代码怎么实现多线程并发处理_PHP多进程与pcntl扩展使用

记得去年在杭州机房,半夜调试网站时,CPU突然上升到9 0%。
原来是图像处理脚本卡住了一半。
当时我们用的是PHP-FPM单进程,一次转换四五张大图直接让服务器超载。
后来我用pcntl fork了4 个子进程,每个进程独立推送一张镜像。
那天晚上之后,我再也没有犯过类似的错误。

使用 pcntl 就像玩操作系统内核一样。
您需要了解进程树的概念。
例如,我有一个新闻推送脚本,使用pcntl fork 1 0个子进程来发送短信,但我忘记添加pcntl_waitpid。
第二天查看监控,发现有3 个僵尸进程挂了,CPU占用率依然很高。
Linux的init进程居然要帮我清理这些垃圾,光是想想就觉得累。

但是fork也有陷阱。
我试图用这个来创建一个高并发的爬虫,但是Linux由于资源限制杀死了子进程并报错。
后来我改用Redis队列和PHP工作模式,稳定得多。
我们团队现在指定,只要任务可以异步处理,优先级队列就不再使用fork。
除非是只需要CPU处理能力的任务,比如机器学习推理。

等等,还有别的事。
之前用pcntl做分布式锁,但是子进程没有释放锁就退出了,导致其他机器超时。
后来我在杀死子进程之前添加了 usleep(1 0) 并解决了这个问题。
这让我想起了操作系统中经典的死锁问题,有时必须通过锁抖动来避免。

现在我想如果 PHP 能够像 Java 一样原生支持协程,那么我们甚至不必考虑多重处理?不过在Linux环境下使用fork其实还是很方便的,尤其是配合systemd的自动重启,完美。
Windows 端就更不用说了,有这么多的限制真是令人沮丧。

PHP如何实现多线程和并发处理?

PHP多线程并发处理方法: 1 . 线程池:使用pthread扩展创建线程池管理函数,如$pool = new Pool(5 , 1 0),并使用submit()提交任务。
2 . 协程:使用 swoole 扩展创建协程池,如 $pool = new CoroutinePool(5 ) 并使用 go() 启动协程。
3 、异步IO:swoole扩展;创建异步IO;使用add()提交IO操作并回调处理结果。
4 .消息队列:swoole扩展;使用push()和pop()创建MessageQueue并执行任务。

注意事项:
PHP本身并不支持多线程;所以需要安装pthread或者swoole扩展。

线程池是CPU密集型的;协程/异步IO适合IO密集型;消息队列适合分发。

确保您已从 Composer 安装了相关扩展,例如 ext-pthread 或 pecl install swoole。

这些方法可以显着提高PHP的并发能力。