IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:并发

共 32 篇相关文章

IT 累计浏览 4,253

gen_tcp调用进程收到{empty_out_q, Port}消息奇怪行为分析

在Erlang/OTP开发中,有开发者发现gen_tcp进程在特定场景下会意外收到`{empty_out_q, Port}`消息,导致消息处理流程异常。作者从问题复现出发,逐步定位到该消息由端口子系统在输出队列清空时发出,但普通用户进程并不需要处理这类系统级消息。 文章详细剖析了端口通信机制和消息传递路径,指出这是Erlang虚拟机的正常行为而非bug。核心原因在于端口与进程的链接关系,使得端口事件会以消息形式送达关联进程。解决方案是开发者需在自己的消息处理逻辑中显式忽略该消息,或调整端口的使用方式。 通过这个案例,读者可以更深入地理解Erlang端口与进程间的通信机制,避免类似问题在实际开发中造成困扰。

IT 累计浏览 3,885

ConcurrentHaspLRUHashMap实现初探

这篇讲的是作者如何尝试实现一个线程安全的LRU缓存结构——ConcurrentHaspLRUHashMap。面对高并发场景下,既需要快速存取、又需要自动淘汰最久未使用数据的需求,现有的解决方案可能各有局限。作者的出发点很明确,就是探索一种能兼顾并发性能与LRU淘汰策略的全新实现。 文章的核心在于拆解这个混合结构的设计思路。它不像传统的ConcurrentHashMap那样只考虑并发存取,也不像简单的LRU列表那样忽略线程安全。作者需要在两者间找到平衡,比如如何用锁或CAS机制保证并发修改时链表顺序的正确性,又如何让哈希表与双向链表高效协作。文中可能会展示一些关键的同步控制技巧,或是性能权衡的具体考虑。 这种自定义容器的实现往往在框架或中间件中很关键。作者通过这次初探,不仅分享了具体代码,更传递了一种解决问题的思路:在复杂约束下,如何拆解需求、组合基础数据结构,并处理好并发细节。对于需要设计高性能缓存或理解Java并发容器原理的开发者来说,其中的实现考量具有直接的参考价值。

IT 累计浏览 8,806

浅析C++多线程内存模型

这篇讲的是C++11标准中引入的一个关键底层特性:多线程内存模型。作者从多线程编程中一个常见的困惑出发——为什么我的同步措施失效了?——引出了这个问题的根源:在不同的编译器、CPU架构和优化级别下,指令的执行和观察顺序可能与你写的代码顺序不一致。 文章的核心是解释C++内存模型如何为多线程程序定义了一套统一的“因果律”和“可见性”规则。它清晰区分了几种不同的内存序,比如宽松的原子操作、具有同步关系的获取-释放序,以及最强的顺序一致性。通过对比,你能看出每种序提供了怎样的保证,又可能带来多大的性能开销。 理解这些规则,是编写既高效又正确的并发代码的基石。它决定了你该在何处加锁,何处使用原子变量,以及如何设置内存序参数,来避免那些最隐蔽、最难调试的数据竞争与诡异Bug。

IT 累计浏览 2,913

把 lua 的 gc 移到独立线程

这篇讲的是如何将 Lua 的垃圾回收(GC)机制从主线程剥离,放到独立线程中运行的技术方案。 作者首先剖析了 Lua 现有 GC 工作机制的细节,指出了其核心痛点:GC 的标记、清除等阶段会与业务代码共享同一个执行线程,不可避免地导致不可预测的长时间停顿,这对于延迟敏感的应用(如游戏、实时服务)是个棘手问题。 文章的核心思路是实现一个“GC 线程”,让它与主线程并行工作。难点在于如何让 GC 线程安全地遍历和清理仍被主线程使用的对象。作者从 Lua 源码出发,阐述了实现的关键点,包括设计一套轻量级的屏障(barrier)机制来记录对象修改、协调两个线程间的对象图访问,以及处理字符串等特殊对象的清理逻辑。 经过改造后,GC 工作主要转至后台,主线程仅需付出很小的屏障开销,从而大幅降低了 GC 引起的峰值停顿。文章不仅给出了清晰的实现路径,也坦诚讨论了并行 GC 带来的额外内存占用等权衡,为需要进行类似优化的开发者提供了扎实的参考。

IT 累计浏览 2,259

Beyond Threading

这篇讲的是 Java 线程模型为何能在并发编程中持续占据重要地位。作者从线程模型如何清晰地建模应用逻辑流出发,点明了它的核心优势:将逻辑线程与操作系统的物理线程一一对应,从而能够直接利用多核处理器的并行计算能力;同时,当逻辑线程数量多于物理核心时,又可以通过操作系统调度,让多个线程分时共享同一个处理器,有效提升 CPU 利用率。 文章指出,这种模型为开发者提供了一种直观且强大的抽象,既匹配了现代硬件的架构,又降低了编写高并发代码的认知负担。它特别适合需要明确控制执行流程、同时又要求高性能并发处理的后端服务、计算密集型或 I/O 密集型应用。作者的分析揭示了,正是这种在清晰逻辑与硬件效率之间的平衡,使得传统的线程模型在许多场景下依然是坚实可靠的选择。

IT 累计浏览 3,647

前端开发中的性能那点事(二)巧用curl 并发减少后端访问时间

这篇讲的是前端开发中一个常见的后端接口性能瓶颈:当页面加载或某个操作需要串行请求多个后端接口时,总耗时是所有请求时间的累加,导致用户等待时间过长。 作者提出,可以巧妙利用命令行工具curl本身的并发执行能力来解决这个问题。核心思路是,将原本需要依次发出的多个请求,通过一次性提交给curl,由它在后台并行发起。这样,多个请求的耗时就从“相加”变成了“取最大值”,从而显著缩短整体等待时间。 文章不仅解释了原理,还可能提供了具体的代码示例,展示了如何构造curl命令来同时处理多个请求,以及这种方式相比在前端代码中手动并发处理的便利性。这是一种非常实用的性能优化思路,尤其适用于那些对后端接口没有严格时序要求的场景。

IT 累计浏览 6,105

学习:一个并发的Cache

这篇讲的是作者从实际需求出发,设计并实现了一个线程安全的缓存包装器 Memoizer。文章的核心在于展示如何利用 Java 的并发工具,优雅地解决“为计算结果缓存”场景下的并发问题。 作者没有选择简单的加锁,而是基于 ConcurrentHashMap 和 FutureTask,构建了一个精妙的方案。当多个线程同时以相同参数调用 compute 时,Memoizer 确保只有第一个线程会真正执行耗时的计算,并将代表该计算结果的 FutureTask 存入缓存。后续线程则直接获取这个 FutureTask,并通过 f.get() 等待结果,从而避免了重复计算。 实现的巧妙之处在于 putIfAbsent 原子操作的运用,它确保了“检查-插入”过程的线程安全。同时,将 FutureTask 作为缓存值,使得计算可以异步进行,而其他调用者可以无阻塞地获取 Future,只是在真正需要结果时才会等待。代码也妥善处理了计算任务被取消或抛出异常的情况,体现了健壮性。 这个实现为我们提供了一个在并发环境下构建高效、线程安全缓存的范本,其思路在优化服务接口性能、避免资源浪费的场景中非常具有启发意义。

IT 累计浏览 5,382

PHP 持久连接于并发

这篇文章深入探讨了PHP持久连接在高并发场景下的实际应用问题。作者从一个常见的业务场景出发:当Web应用面临突发或持续的高并发请求时,频繁创建和销毁数据库连接会带来显著的性能开销。文章并未停留在理论层面,而是具体分析了PHP中持久连接的工作机制,以及它在与诸如MySQL这类数据库配合使用时,可能带来的好处与潜在风险。 核心内容围绕如何正确配置和使用持久连接以提升并发处理能力展开。作者通过具体配置示例和代码片段,说明了在php.ini或代码中设置持久连接参数的关键点,并指出了常见的误区,例如误以为持久连接等同于万能的性能提升方案。文章特别强调了在并发环境下,持久连接若管理不当,反而可能导致连接数耗尽、数据不一致等问题。 最终,文章给出了在实际项目中平衡性能与稳定性的实践建议:在评估自身应用的并发模型、服务器资源及数据库配置后,有选择地启用持久连接,并辅以严密的监控。对于正在优化PHP应用性能、特别是数据库访问瓶颈的开发者来说,这篇文章提供了非常具体和可操作的思路。

IT 累计浏览 3,769

PostgreSQL与MySQL的区别

这篇讲的是 MySQL 和 PostgreSQL 这两大数据库该如何选择。作者没有罗列枯燥的特性列表,而是直接切入两者最核心的定位差异:MySQL 为了极高的查询速度和易用性,在功能上做出了取舍;而 PostgreSQL 则忠实于 SQL 标准,提供了更丰富、更严谨的功能,比如复杂的查询、完整的约束和更强的扩展性。 文章进一步指出,这种哲学上的不同,直接决定了它们各自最适合的场景。如果你的应用需要处理海量数据、追求极致的读写性能,比如高并发的 Web 应用,MySQL 可能是更直接的选择。反之,如果你从事地理信息系统、数据分析,或者需要处理复杂的数据关系并保证数据的完整性和正确性,PostgreSQL 强大的功能和对标准的坚持会带来巨大优势。最后文章还提到,PostgreSQL 在近年来的版本中性能已有长足进步,而 MySQL 也在通过插件等方式增强功能,但二者底层的设计思想差异依然明确。

IT 累计浏览 3,771

MySQL 并行了吗?

这篇讲的是MySQL并行能力的一个常见误解。作者从与同行的讨论出发,直接给出了明确结论:MySQL目前并不具备针对单个查询的并行执行能力。文章特别澄清了MySQL 5.4版本带来的性能提升本质——它提高的是系统处理并发请求的吞吐量,而非缩短单条查询的响应时间。这意味着,如果应用场景侧重于单个复杂查询的执行速度,升级到5.4版本后,其表现可能反而不如5.1或更早的版本。作者指出,5.4的优化方向在于“并发量”,而非“单语句效率”,这对需要精准评估版本升级价值的开发者来说,是一个关键的技术辨析。

IT 累计浏览 5,219

大型网站的Lucene应用

这篇讲的是beta技术沙龙上关于Lucene在大型网站中实际应用的分享。作者从亲身参与大型网站搜索系统建设的角度出发,没有空谈理论,而是聚焦于Lucene在海量数据和高并发场景下暴露出的具体挑战与优化思路。文章回顾了上次沙龙关于缓存(mod_cache)与并发模型的讨论,并指出,对于处理亿级文档的检索服务而言,基础理论之外,如何调优分词、索引结构、查询性能以及应对硬件限制,才是工程落地时必须翻越的大山。 分享中很可能包含了在特定业务场景下,对Lucene底层API进行定制化改造的实践案例,或是对比了不同参数配置、硬件选型对最终效果的影响。这类来自一线生产环境的“避坑”指南和经验沉淀,对于正在或即将构建大规模搜索服务的技术团队来说,比单纯的原理讲解更具参考价值,能直接帮助读者在架构设计初期就考虑到那些关键的可扩展性与性能瓶颈。

IT 累计浏览 3,798

MySQL优化 之 Discuz论坛优化

这篇讲的是Discuz论坛在高并发场景下的性能顽疾及其关键解法。作者很早就注意到,许多Discuz论坛一旦访问量稍大,就会出现响应卡顿、锁等待严重的现象,其根源往往在于数据表仍使用默认的MyISAM引擎。MyISAM的表级锁机制在并发写入时会成为巨大瓶颈,导致大量线程排队等待。 核心的优化方案非常直接:将相关的数据表引擎从MyISAM转换为InnoDB。InnoDB采用行级锁并支持事务,能更好地处理并发操作,从而显著缓解锁冲突,提升论坛的整体响应速度。文章并非泛泛而谈,而是基于长期观察和大量案例总结出的“扫盲”指南,点明了这个许多新手容易忽略却又至关重要的配置细节。