图书前言

作 者 简 介

基里尔•波波洛夫(Kirill Bobrov)是一名经验丰富且略带脾气的软件工程师。他擅长设计和开发高负载应用,对数据工程充满热情,目前专注于为全球公司实施前沿的数据工程方案。此外,基里尔也是热门插画技术博客(网址为https://luminousmen.com)背后的神秘高手。

致  谢

在深入探讨并发之前,我想先表达我的感激之情,没有这些杰出人士的支持,本书不可能出版。有人将写书比作跑马拉松,但我认为写书的体验更像一场狂野的过山车之旅,幸运的是,有这些伙伴的陪伴!

首先,我要向我的妻子叶卡捷琳娜•克里弗茨(Ekaterina Krivets)表达我最深的感激之情,她为本书贡献了所有令人惊叹的插图。

其次,我的团队也一直陪伴着我,并给予我支持。特别感谢基里尼娜•亚利雪娃(Kristina Ialysheva)、米哈伊尔•波尔托拉茨基(Mikhail Poltoratskii)、塔蒂娜•波罗丁娜(Tatiana Borodina)、安德烈•加维罗夫(Andrei Gavrilov)和亚历山大•贝尔尼茨基(Aleksandr Belnitskii),他们始终在我身后,给予我信任和支持我。特别感谢维拉•克里弗茨(Vera Krivets),她帮助我润色英文。

柏特•贝茨(Bert Bates)和布莱恩•哈纳菲(Brian Hanafee)的教导和理念深刻地影响了我对教学和讲解复杂概念的方式。感谢二位的宝贵建议和贡献。

我深深感谢Manning出版社的团队。迈克•斯蒂芬斯(Mike Stephens)引领了这场激动人心的冒险,我对他的感激无以言表,感谢他给予我此次机会。艾恩•豪(Ian Hough)耐心地逐章帮我修正书中的英文错误,感谢他帮助我编辑本书。阿瑟•朱巴列夫(Arthur Zubarev),感谢他不厌其烦地审阅初稿中的错误并提供有价值的反馈。

劳•科维(Lou Covey),我想为我偶尔的失礼向他表示歉意,感谢他给予我的持续鼓励。马克•托马斯(Mark Thomas),感谢他对本书进行技术审阅和代码检查。蒂凡尼•泰勒(Tiffany Taylor)的精细工作和专业知识显著提高了本书的清晰度和连贯性。凯蒂•坦纳(Katie Tennant),没有他十分细致的审查和编辑,本书内容不可能得以完善并成功出版。

对于本书所有的审阅者,包括阿祖吉特•纳亚克(Abhijith Nayak)、阿姆拉•乌穆德鲁(Amrah Umudlu)、安德烈斯•萨科(Andres Sacco)、阿纳德•贝利(Arnaud Bailly)、巴尔比尔•辛格(Balbir Singh)、比吉斯•科马兰(Bijith Komalan)、克里福德•萨伯(Clifford Thurber)、大卫•雅科博维奇(David Yakobovitch)、德米特里•沃罗比乌夫(Dmitry Vorobiov)、埃德度•梅伦德斯(Eddu Melendez)、埃尔内斯托•阿罗约(Ernesto Arroyo)、埃内斯托•波西(Ernesto Bossi)、艾山•坦德逊(Eshan Tandon)、埃兹拉•雪里德(Ezra Schroeder)、弗兰斯•欧林基(Frans Oilinki)、甘盛•斯瓦米纳汀(Ganesh Swaminathan)、格雷•古森斯(Glenn Goossens)、格雷戈里•瓦尔吉塞(Gregory Varghese)、伊玛克丽特•雷斯托•莫莎(Imaculate Resto Mosha)、詹姆斯•祖吉恩•刘(James Zhijun Liu)、吉里•捷西涅克拉(Ji•í •in•ura)、约翰顿•里维斯(Jonathan Reeves)、拉瓦尼亚•埃姆•克(Lavanya M K)、卢克•罗格(Luc Rogge)、马诺杰•雷德迪(Manoj Reddy)、马特•古柯斯基(Matt Gukowsky)、马特•惠尔克(Matt Welke)、米卡勒•达特雷(Mikael Dautrey)、诺兰•托(Nolan To)、奥利弗•科顿(Oliver Korten)、帕特里克•戈茨(Patrick Goetz)、帕特里克•雷金(Patrick Regan)、拉古纳斯•贾瓦哈尔(Ragunath Jawahar)、萨伊•赫格德(Sai Hegde)、赛尔吉奥•阿贝罗•罗德里格兹(Sergio Arbeo Rodríguez)、舍罗希卡•库拉蒂拉克(Shiroshica Kulatilake)、文卡塔•纳格恩达•巴布•亚纳马达拉(Venkata Nagendra Babu Yanamadala)、维塔利•拉尔什诺科夫(Vitaly Larchenkov)和威廉•詹米尔(William Jamir),感谢他们为本书提供了宝贵的建议,使本书质量更上一层楼。

我还要特别感谢无私奉献的幕后英雄们。虽然他们的付出默默无闻,但其意义重大。他们是真正的明星!

最后,就像斯诺普•道格(Snoop Dogg)所言,我还要感谢我自己。如果没有我,就没有这本书。

前  言

畅想一个技术飞速发展的世界,其演进的速度远超狂奔的猎豹,人们对高效并发编程的需求达到了前所未有的程度。在这个世界中,软件工程师面临严峻的挑战,既要构建足以应对海量数据并能进行高速处理的系统,同时还要满足用户无尽的需求。这是一个并发既令人着迷又充满困惑的时代,而我们正生活在这个时代。

我曾经深受并发问题的困扰。后来,我偶然了解到“并发”和“异步”的概念,这无异于发现了一处隐藏的宝藏。如果能善加利用这份秘而不露的宝贵资源,就可以将普通代码变成算力惊人的程序。然而,这份宝藏非常复杂,涉及许多技术名词,比如并发、并行、线程、进程、多任务和协程等。为了揭开并发编程的神秘面纱,我渴望找到一位向导,帮助我将所有知识条理清晰地串联起来。但是,由于一直未能找到能够将不同编程语言理论与实践结合起来的教程,我决定亲自着手编写。《并发编程图解》一书就是这样诞生的。希望本书能够成为各位读者探索知识迷宫的指南针,解开谜题,照亮前行。

不同于普通技术图书,本书特意插入了许多读者感兴趣的故事和趣闻。相比于理论书籍,本书更像是一本风趣幽默的故事书,并配有多幅幽默的插图,读者不妨细数!在保持风趣幽默的同时,本书也不隐瞒对饺子和比萨的喜爱,学习并发编程本就是一件趣事!

本书将陪伴读者一同征服并发编程中的难题,解密异步编程的谜团。从并发基础知识到async和await的使用,本书将使用Python语言作为学习过程中的可靠伙伴。即使读者对Python不够熟悉也无需担心,本书涉及的概念和方法并不局限于具体实现。

然而,读者可能会想:“为什么偏要选择Python呢?”这是因为Python在简单和强大之间实现了完美的平衡,能让开发者专注于并发的本质。此外,作为作者,我也毫不隐瞒对Python的喜爱。

无论你是希望加深对并发系统理解的资深开发者,还是对并发底层机制抱有好奇心的新人,本书都有适合你的内容。通过挖掘并发编程的秘密,读者将学习如何构建可扩展、高效和有弹性的软件系统,以应对任何挑战。

亲爱的读者,准备开启一段独特的学习之旅吧!在这段旅程中,时空的界限将变得模糊,程序会以章鱼般的节奏“舞动”。是的,你没听错——章鱼。作为来自深海的可爱生物,其八条触须配合得天衣无缝,就像并发系统一样既复杂又迷人。我们的旅程马上开启!

关于本书

并发、异步和并行编程领域繁冗复杂,本书力求用清晰且幽默的方式讲解其中的基础知识和实践技巧。不同于学术研究论文和编程图书,本书重点介绍底层思想和原理,而不是具体的实现细节。本书使用了风趣易懂的语言,并利用图表而不是复杂的数学概念进行阐释。通过阅读本书,读者将了解并发编程框架,并能在实际开发场景中使用可扩展的解决方案。本书填补了市场空白,为想要掌握并发和异步的开发者提供了一条学习捷径,并提供了全面且易懂的指南。否则,开发者可能需要多年的开发经验才能真正理解并发编程的精髓。

目标读者

本书适合想要了解并发编程基础知识的读者。为了充分利用好本书,读者应具备计算机系统、编程语言和数据结构的基础知识,以及顺序编程方面的经验。读者不需要具备操作系统方面的知识,因为本书已提供所有必要的信息。虽然本书涉及网络概念,但不会对其进行详细讨论,因此假定读者具备网络基础知识。读者不需要对这些主题有深入了解,如果有需要,可在阅读本书的同时再进一步学习。

本书内容

本书分三篇。第一篇“章鱼交响乐团:并发交响曲”,介绍了基本概念和编写并发程序的方法。通过分层的方式,从硬件层到应用层,第1~5章介绍了并发的基础知识。

第二篇“并发的章鱼触手:多任务、分解、同步”,讨论了如何利用抽象和流行的设计模式提高代码性能、可扩展性和弹性。在第6~9章,读者将学习如何避免构建并发系统时最常见的问题。

第三篇“异步章鱼:使用并发原理烹饪比萨”,基于前面章节介绍的并发知识,将讨论如何从单台机器扩展到多台联网机器。经过扩展,事件可以异步进行,即一个事件的发生时间不同于另一事件。第10~12章将重点介绍异步概念,展示并发的另一维度。以前,异步只是用来处理并发或并行任务,但现在可以将异步和真正的并发操作结合起来,以提高系统性能。第13章通过逐步拆解一系列并发问题为本书画上句号,助力读者完全掌握并发编程的核心技能。

下载代码

本书中示例的完整源代码可以从GitHub(https://github.com/luminousmen/grokking_concurrency)下载,也可通过扫描本书封底的二维码下载。源代码的目的是作为程序实现的参考。为了便于学习,这些示例代码已经过一定优化,充当教学的工具,但不一定适用于生产环境。对于生产环境项目,建议使用成熟的库和框架,因为它们通常对性能进行了优化,经过了良好的测试且支持度更高。