Actors in Scala(Scala中的Actor)(预打印版) 第一章 Concurrency Everywhere (A)

VLOOKUP_fixed.py 立即下载

Actors in Scala(Scala中的Actor)(预打印版) 第一章 Concurrency Everywhere (A)

guibin.beijing@gmail.com

2011.09.29


写在原文开始翻译之前的一些琐事。

本人在2003年结识了Java,在Java世界中摸爬滚打了6年后,从2009年开始学习Scala。最近2年使用Scala设计、开发并上线了股票衍生数据实时处理平台,效果颇好。回首2年来使用Scala,曾经遇到过非常多的困难和疑惑,好在本人的英文水平还不错,这些问题大多数能在StackOverflow、Scala Reference、Programming In Scala和Scala的源代码中找到答案。最近又在浏览Actors in Scala,发现其中对于Actor的介绍颇深,受益匪浅,不敢独享,因此翻译写出来与大家分享,给那些想深入学习Scala但是英文水平一般弟兄们一点帮助。我会在翻译中加入自己的一些理解,全当读书笔记了。如果有不恰当的地方,请及时指出,以免误导更多的人,谢谢大家。


第一章 Concurrency Everywhere(处处是并发)

Actor的并发模型诞生于实际的需求:70年代当Carl Hewitt和他的团队在麻省理工大学首次提出actor的模型的时候,当时计算机的计算速度已经比较慢了。然而当时已经可以做到将一大块工作分解到多台计算机上并且让他们并行计算。可是Hewitt的团队想设计一种能够非常简单的建立并发系统的模型,而且使用者还可以使用这个模型推理并发系统的行为。他们确信基于这样的模型推理,便可以使得开发者对他们所开发的并发程序的行为更有把握。


虽然基于Actor的并发模型自从诞生以来一直是一个非常重要的概念,但是直到最近这个概念才被广泛接收,这在某种程度上也是因为截止目前为止也没有出现一门广泛使用的,并且对Actor提供良好支持的语言。一个有效的Actor模型的实现,往往给宿主语言带来的巨大的负担,因此主流语言几乎都无法胜任这个任务。此时Scala出现了并接收了这个挑战,并且基于JVM实现了Actor并发模型的全部特性。因为Scala代码可以无缝与Java源代码、Java类库或者其他的JVM语言互操作,所以Scala的Actor模型提供了一种激动人心的实际方式去构建一个可扩展的、可靠的并发程序。


就像其他有影响力的概念一样,Actor模型可以在多个层次理解和使用。在第一个层次上,基于Actor的编程模型提供了一种能在独立运行的线程或者进程间交换消息的简单方法。在另外一个层次上,Actor模型通常使得并发编程更简单,因为Actor模型使得开发者更专注于高层次的并发抽象,使得开发者从纷繁复杂的、易出错的底层细节中解脱出来。在更高的层次上,Actor模型是在一个并发是常态而非异常的世界中构建可靠程序的快速方法。


本书着眼于解释使用Scala在以上这三个层次上进行基于Actor的编程。在进入Actor的细节前,先后退一步,我们把Actor和其他的并发编程方法比较一下,这些方法你也许已经比较熟悉。


1.1 Scaling with concurrency(并发扩展)

在过去几十年中,主流的计算架构都是着眼于如何使得单线程的指令序列执行的更快。这就导致了对于应用程序计算性能的摩尔定律:在过去的二十年中,单位成本的处理器性能大约每18个月会翻一倍,并且开发者依靠这些处理性能的增长趋势来确保他们开发的越来越复杂的程序会执行得更快。


摩尔定律已经非常精确的预测了处理器性能的增长,并且在过去的20年中,期望处理器的计算能力每一年半翻倍一次也非常合理。这些年,为了使得这样的增长趋势更实际,芯片设计师不得不在他们的设计方向上做了重大转换。目前不再试图再去提高专注于执行单线程指令的CPU时钟周期,而是在新的设计中尽可能在单个CPU芯片上执行多个并发线程。在未来几年中,在一块芯片上的每个计算核心的时钟速度的提高余地将会非常小,而普通服务器已经具有了多个内核的CPU,多核芯片在廉价的桌面电脑和笔记本电脑也越来越平常。


诸如Inter X86这样普通处理器架构设计上的巨大转变,给开发者(的思路)带来了两个分支。首先,由于单个内核的时钟频率增加越来越小,我们将不得不更加注意序列代码的算法效率。其次,这一点在Actor模型中更重要,那就是我们需要设计出能够尽可能利用可用CPU内核的程序。换句话说,我们不但要写出能够在支持并发的硬件上正确执行的程序,而且要设计出能够方便扩展到所有可用CPU内核上执行的程序。


1.2 Actor versus threads (Actor与线程的对比)

在并发程序中,许多独立执行的线程或独立执行的处理序列一起工作,来履行应用程序的需求。仔细调查并发程序,你会发现并发程序绝大多数时候都在定义“并行执行的序列处理将如何通信”,这样做的目的是为了使得并行程序执行变得可预测。


在并行线程间通信的两个最常用的方法是对共享状态的“同步”和消息传输。许多熟悉的程序结构,比如semaphores and monitors(信号和监视器)都是基于共享状态同步的。并行程序的开发者应该对这两个结构都非常熟悉,比如Java程序员可以在java.util.concurrent库中找到这些结构。任何人使用共享状态同步的最大挑战就是如何避免并发危害,比如数据竞争、死锁和平行扩展。


消息传输是多个协作线程间通信的替代方式。有两种重要类型的系统是基于消息传输的。在基于通道(channel-based)的系统中,消息被发送到进程可以共享的通道或者端口上,而进程可以从相同的通道或者端口上接收消息。比如基于通道的系统MPI(Message-Passing Interface)和基于CSP(Communicating sequential processes)范式的系统,比如Go语言。基于Actor的系统(或者代理、或者Erlang风格的处理)是消息传输并发的第二种。在这些系统中消息直接发送给Actor,而没有必要在进程间创建中介通道。


消息传输对应于共享状态并发更重要的优点是消息传输更容易避免数据竞争。如果进程间仅仅通过消息传输通信,并且这些消息都是immutable(不可更改的),那么竞争就从设计上消除了。此外,许多证据建议,在实际中这种方式能够减少死锁。消息传输的一个潜在的缺点是通信的开销比较高。为了通信,进程不得不创建和发送消息,并且这些消息在被取走去异步通信前,经常被缓存在队列中。相反,共享状态并发使得线程直接访问共享内存,只要共享内存被正常同步了。为了减小消息通信的开销,大消息不应该通过拷贝消息状态的方式传输,相反仅仅传输消息的引用。然而当多个线程同时访问相同的可更改的消息(资源)时,又再次引入了数据竞争。这是一项正在进行的静态检查器(比如Scala的编译器为独特类型提供的插件)的研究工作,静态检查器能够验证通过引用传输的可更改消息的程序不包含数据竞争。


让我们退一步从更高的视角来看看基于Actor的编程。为了比较Actor模型与传统的并发设计的区别和联系,我们来快速看一下当地铁路战场的工作情况。


设想一下,你站在一座大桥上俯瞰多条单独的轨道进入铁路站场。你能观察到许多看起来似乎是相互独立的行为在发生,比如火车到达、小轿车被装载、卸载等等。


假设你的工作是要设计铁路站场。想想诸如线程、锁、监视器等这些术语与解决在铁路站场中火车在并行的铁轨上运行而不冲撞是多么相似。这是一个非常重要的要求,没有这点要求铁路站场将会变成非常危险的地方。为了完成这个任务,你可以使用一些特别的工具,比如semaphores(信号量), monitors(监视器), switches(交换器)。


Actor模型从更高角度阐述了相同的铁路站场,它确保所有的并发行为在铁路站场中平稳运行:所有的运载车辆都能找到前往运货车厢的路,所有的列车都能在轨道上平稳前进,所有的行为都得到合适的协调。


在设计铁路站场时你需要两个视角:想想单独铁轨上的较低视角,在这个视角中,需要确保火车不会故意越轨;想想整个火车站场设施的视角,在这个视角中,要确保你设计的铁路站场总体上平稳运营,并且铁路站场如果有需要的话可以扩展以容纳未来增长的交通流量。简单的添加新的铁轨不足以解决问题:你需要一些整体的设计规则以确保整个铁路站场能够处理增长的交通流量,并且如果有更大的交通流量的话能够扩展使用全部轨道的运力。


对相对底层的单独轨道的细节(或者说线程间通信相关的问题)的研究与另一方面更高层次的全部铁路站场设施(Actor模型)的研究需要不同的技能和经验。基于Actor的系统通常使用线程、监视器、锁等实现,但是Actor隐藏了那些底层的细节,使得你可以从更高的有利位置来思考并发程序。



YOLO26算法心电图十二导联目标检测+训练好的模型+368张数据集+pyqt可视化界面.zip 附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[导联I(I), 导联II(II), 导联III(III), 胸导联V1(V1), 胸导联V2(V2), 胸导联V3(V3), 胸导联V4(V4), 胸导联V5(V5), 胸导联V6(V6), 加压肢体导联aVF(aVF), 加压肢体导联aVL(aVL), 加压肢体导联aVR(aVR)] · 训练集:313 张 · 验证集:37 张 · 测试集:18 张 · 总计:368 张 该数据集聚焦于临床心电图信号的精准识别与定位,其核心检测目标为标准12导联心电图中的各个独立导联波形区域,涵盖肢体导联(I、II、III)与加压肢体导联(aVR、aVL、aVF),以及胸前导联(V1至V6),适用于心电图自动分析系统中对各导联位置的快速准确标注与分类。数据采集场景真实还原了医院心电图室或急诊监护环境下的标准心电图记录纸,波形清晰、基线稳定,具有高度临床参考价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 57 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9708** mAP50-95 | 0.6344 Precision | 0.8990 Recall | 0.9191 train/box_loss | 1.2231 train/cls_loss | 0.9703 val/box_loss | 1.2779 val/cls_loss | 0.... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。 立即下载

相关推荐

企业级AI助手平台 开箱即用的全栈AI平台,支持多智能体协同、Supervisor模式编排、多种决策模式、RAG技术和流程编排能力 支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化

企业级AI应用开发框架,支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化能力,提供可视化流程编排、自主决策智能体与多智能体协同调度,兼容主流 Agent Skill 协议,帮助企业与开发者零门槛快速构建安全、高效、可落地的AI智能体应用与行业解决方案。

Actors in Scala(Scala中的Actor)(预打印版) 第一章 Concurrency Everywhere (B)

Actors in Scala(Scala中的Actor)(预打印版) 第一章 Concurrency Everywhere (B) guibin.beijing@gmail.com 2011.10.01 1.3 The indeterministic soda mac

张贵宾的技术专栏 2603

基于动态窗口法DWA的机器人路径规划研究(Matlab代码实现)

内容概要:本文系统研究了基于动态窗口法(DWA)的机器人局部路径规划算法,深入剖析其在动态环境中实现自主避障与实时轨迹优化的核心机制。文章详细阐述了DWA算法的速度空间采样策略、轨迹预测模型、动力学约束处理及多目标代价函数的设计原理,并通过构建完整的Matlab仿真框架验证算法有效性。结合典型场景的仿真实验,展示了机器人在复杂障碍物环境下如何实时生成安全、平滑且符合运动学约束的最优路径,充分体现了DWA在移动机器人导航中的实用性与鲁棒性。; 适合人群:具备机器人运动规划基础知识和Matlab编程能力,从事智能移动机器人、自动驾驶或服务机器人研发的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解DWA算法的理论基础与实现细节;②掌握机器人局部路径规划的仿真实现方法;③为实际机器人系统的导航模块开发提供可复用的算法原型与代码参考;④作为进一步研究高级导航算法(如TEB、MPC)的技术基础。; 阅读建议:建议结合提供的Matlab代码逐模块分析与调试,重点关注速度采样、轨迹积分、障碍物距离计算及代价评估等关键环节,通过调整参数在不同地图环境中进行对比实验,以深刻把握算法性能与参数之间的关系,进而提升对实时路径规划系统设计的理解与应用能力。

深入理解Scala默认参数函数:从方法重载到优雅API设计

我写这篇文章的时候,特意没罗列默认参数有多少种用法——因为用法很简单,谁都能写。默认参数为什么重要?可选参数。Java里你想要可选参数?写重载方法。想要几个?写一堆。代码臃肿,维护痛苦。Scala的默认参数把这件事简化了——一行函数签名,编译器帮你生成所有的重载方法。调用方想用默认值就用默认值,想改哪个就改哪个,不用管顺序。把重复的事情交给编译器,让程序员专注在业务逻辑上。你不用手写重载方法——编译器帮你写。你不用记参数顺序——命名参数帮你记。你不用写Builder类——默认参数就是Builder。

https://starzy1990.github.io/ 749

【轴承故障诊断】用于轴承故障诊断的集中时频分析研究(Matlab代码实现)

内容概要:本文系统研究了用于轴承故障诊断的集中时频分析技术,重点解决了传统时频分析方法在处理非平稳信号时存在的能量分散与分辨率不足等问题。通过引入集中时频分析方法,能够有效聚焦信号能量,精确提取轴承故障特征频率,提升故障识别的准确性与时效性。文章详细阐述了该方法的理论基础,并结合仿真信号与实际实验数据验证其优越性能,同时提供了完整的Matlab代码实现流程,涵盖信号预处理、时频变换、参数优化及结果可视化等环节,便于读者复现与拓展应用。; 适合人群:具备一定信号处理理论基础和Matlab编程能力的研究生、科研人员,以及从事机械设备状态监测、故障诊断与预测性维护工作的工程技术人员。; 使用场景及目标:①应用于电机、风机、齿轮箱等旋转机械的早期轴承故障检测,实现故障预警;②提升工业设备运维系统的智能化水平,支撑预测性维护体系构建;③作为高校或研究机构在信号处理、机械故障诊断等课程中的教学案例与实践素材。; 阅读建议:建议读者结合文中提供的Matlab代码逐段运行与调试,深入理解集中时频分布的生成机制及其关键参数(如核函数选择、平滑窗口大小)对诊断效果的影响,并尝试将其应用于其他类型的机械故障信号分析中,开展对比研究以深化对该方法适用性的认识。

【高低温试验】试验报告模板

高低温循环试验,验证被测设备(DUT)在极端高温、低温环境下的性能稳定性、功能可靠性及安全性,确保其符合设计规范和相关标准(如GB/T 2423.1、GB/T 2423.2)。:验证设备在剧烈温度变化下的耐受能力(如-40℃↔+85℃,温变速率≥10℃/min)。低温测试标准:GB/T 2423.2-2008(温度-40℃,保持时间4小时):模拟高温高湿环境(如温度+60℃,湿度95%RH),测试防潮性能。

电路巫师把一切不可能变成不可能 1565

深入理解Scala嵌套函数:作用域封装之道

我写这篇文章的时候,特意没罗列嵌套函数有多少种写法——因为写法很简单,谁都能写。嵌套函数为什么重要?辅助逻辑的作用域应该是多大?Java里你写辅助逻辑,只能写到类级别——因为Java的方法必须定义在类级别。但很多辅助逻辑其实只属于某一个函数,不属于整个类。你把它们写到类级别,就造成了作用域放大——本来应该是函数内部的东西,变成了类级别的东西。Scala的嵌套函数把这个问题解决了——辅助逻辑可以精确地封装在主函数内部。它直接访问外层函数的变量,不用把上下文传来传去。它不暴露到类级别,不造成API膨胀。

https://starzy1990.github.io/ 738

Cadence Allegro PCB文件对比实战:3分钟搞定两份设计差异(附颜色标注技巧)

本文详细介绍了如何高效使用Cadence Allegro的Design Compare功能进行PCB文件差异对比。通过实战工作流,可在3分钟内精准定位并理解两份设计在布局、布线、元件等方面的关键差异,并分享了自定义颜色标注技巧,帮助工程师快速聚焦重要修改,提升设计评审与团队协作效率。

weixin_29248653的博客 378

深入理解Scala可变参数函数:从Java数组语法到优雅集合传递

我写这篇文章的时候,特意没罗列可变参数有多少种用法——因为用法很简单,谁都能写。Scala的可变参数为什么比Java好用?不是因为它有:_*这个语法——而是因为它的底层是Seq,不是数组。Java的可变参数是数组的语法糖——你传List进去,它不认,因为List不是数组。你想传?自己转。Scala的可变参数是Seq的语法糖——你传任何序列进去,只要用:_*展开就行。不用转,不用强转,一行代码搞定。**这就是函数式语言的设计哲学:可变参数不是"数组的便捷写法",它是"序列的便捷写法"。

https://starzy1990.github.io/ 440

免费,Python蓝桥杯等级考试真题--第10级(含答案解析和代码)

Python中蓝桥杯算是含金量和难度最大的比赛之一,网上可以找到不少真题,不过要么零零散散要么付费才能解锁,而且大都是没答案和解析的,给学习者造成很大困扰。因此本文档打算整理历年等级考试、STEMA、省赛、国赛真题卷和解析,供大家学习参考。

1576

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验(一)

阿里云推出国内首个集成“快思考”与“慢思考”能力的 Qwen3-8B 大语言模型,以80亿参数和 128K 上下文支持,重塑AI应用边界并助力开发者高效部署

以微薄之力,予他人些许温暖. 2万+

深入理解Scala Map:从实现原理到工程实践

我写这篇文章的时候,特意没罗列Map有多少个方法——因为那些东西官方文档都有,查一下就行。Map到底解决了什么问题?它不是"带key的列表",它是一个"从key到value的映射函数"。它用哈希表的O(1)查找,换来了通过key快速找到value的能力。在大数据开发里,Map无处不在——维度关联、配置映射、计数统计、分组聚合、缓存索引。理解了Map,你就理解了大数据处理里最核心的几个操作:查找、映射、聚合。很多人用了几年Map,还停留在"new一个HashMap,然后put put put"的阶段。

https://starzy1990.github.io/ 390

Openclaw 错误分析 与 解决方案 之:Selected model is at capacity. Try a different model, or wait and retry.

Openclaw 错误分析 与 解决方案 :Selected model is at capacity. Try a different model, or wait and retry.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 6415

深入理解Scala匿名函数:函数式编程基石

我写这篇文章的时候,特意没罗列匿名函数有多少种写法——因为写法很简单,谁都能写。匿名函数为什么是函数式编程的基石?把函数当参数传。你不能把函数当参数传,就没有map、filter、reduce这些集合操作。没有这些集合操作,就没有声明式编程。没有声明式编程,就没有函数式编程。Java花了很长时间才意识到这一点——Java 8才加了Lambda。但Java的Lambda是不完整的——它只能捕获final变量,不能修改变量。它是一个"阉割版"的闭包。Scala呢?

https://starzy1990.github.io/ 518

Allan方差这个工具,怎么把它用的更顺手?(附Allan方差、动态Allan方差代码)

本文详细说明了Allan方差和动态Allan方差的计算过程,并通过递归运算和时间序列选择两种算法提高动态Allan方差的计算效率。文末提供了快速动态Allan方差计算代码。

victoryqian528的博客 372

JAX/JAXlib GPU 加速版本安装教程(CUDA)

本文介绍了在Windows WSL2+Ubuntu22.04环境下配置JAX/JAXlib GPU加速版本的详细步骤。使用RTX 4060显卡,安装CUDA 12.4和cuDNN 8.9.7驱动,通过Miniconda创建Python 3.9虚拟环境。具体步骤包括:安装Miniconda、配置CUDA环境变量、安装cuDNN驱动、下载并安装JAX/JAXlib。最后通过测试代码验证GPU加速功能,成功检测到GPU并完成矩阵运算。整个过程配有详细命令和截图说明,适合需要搭建JAX GPU开发环境的用户参考。

猿小白的博客 626

Scala List操作:不可变链表的函数式美学

Scala的List,表面上是Java List的"Scala版",本质上是函数式编程的核心数据结构——不可变的链表,配合模式匹配和递归,构成了声明式数据处理的基础。天然线程安全:不可变对象不需要锁,在多线程环境下可以安全共享结构共享:操作List时可以复用大部分结构,性能更好函数式友好:map/filter/reduce不修改原List,可以组合、可以嵌套这些特性不是孤立的,它们共同支撑了Scala的函数式编程范式。

https://starzy1990.github.io/ 1338

PrimeTime low power-多电压设计流程(2)

get_power_switches`、`get_supply_nets` 和 `get_supply_ports` 命令的操作方式类似,并具有类似的命令选项。PrimeTime 根据 UPF 命令构建电源供应网络,包括 create_power_domain、create_supply_net、create_supply_set、create_supply_port、set_domain_supply_net 和 connect_supply_net。电源集句柄是为电源域隐式创建的一个抽象电源集。

QRBQ 712

【Spark】 04键值对 RDD:创建、常用操作与数据分区

介绍 Spark 键值对 RDD 的创建方式、聚合、分组、连接、排序与行动操作,并结合 PageRank 示例讲解数据分区、分区器复用与自定义分区方式。

qq_46126258的博客 370

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大数据Spark(八十二):Spark 算子综合案例

本文通过四个典型Spark算子应用案例,系统讲解了单词频次过滤、PV/UV统计、二次排序及分组取TopN的实现方法。涵盖flatMap、mapToPair、reduceByKey、distinct、sortByKey、groupByKey等核心算子的组合使用,提供Java与Scala双语言实现,兼顾可读性与实用性。强调根据数据规模选择合适方案,避免内存溢出,适用于大数据处理场景的实战参考。

Lansonli(蓝深李)的博客 613

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

深入理解Scala递归函数:从栈溢出到尾调用优化

我写这篇文章的时候,特意没罗列递归有多少种写法——因为递归的语法很简单,谁都能写。为什么Java的递归会栈溢出,而Scala的不会?不是因为Scala更厉害——而是因为Scala是函数式语言,递归是它的核心特性之一。它从设计之初就考虑了尾调用优化的问题。Java是命令式语言,它的核心是对象和方法,递归只是一个"能用但不推荐"的特性。Java程序员写递归:栈溢出,不敢用Scala程序员写递归:尾递归,随便写递归不是洪水猛兽,栈溢出是因为你没写对。你可以用递归的优雅写法,获得循环的性能。

https://starzy1990.github.io/ 614

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入理解Scala可变Map:动态构建场景下的性能与设计权衡

我写这篇文章的时候,特意没罗列可变Map有多少个方法——因为那些东西官方文档都有,查一下就行。为什么需要可变Map?不是因为"它就是Java HashMap的Scala版",而是因为在动态构建数据的场景下,不可变Map的性能不够好。你要在循环里不断往Map里加key-value对,用不可变Map就是O(n²)的灾难,用可变Map就是O(n)的高效。但可变Map也不是万能的。它只适合"构建"场景——你在一个方法内部,动态构建一个Map,最后输出一个不可变Map。

https://starzy1990.github.io/ 360

深入理解Scala元组:从多返回值到模式匹配的桥梁

函数式编程里,函数的参数和元组是一一对应的。在函数式编程里,一个函数可以看成是接收一个参数、返回R的函数。这个叫"函数的元组化"(tupled)。而Scala的类型系统在处理多参数函数的时候,需要为每个参数数量生成对应的函数类型——、…、。因为函数最多到Function22,所以元组也最多到Tuple22。这是一个统一的设计——元组和函数,共享同一个N的上限。那22以上怎么办?用嵌套元组或者case class。// 超过22个元素:用嵌套。

https://starzy1990.github.io/ 699

深入理解Scala函数定义:从方法到函数的类型跨越

最常用的方式。定义一个方法,属于当前类/对象。name特点:有名字、有参数类型、有返回类型(可以省略,编译器推断)、函数体用连接。定义一个函数值,它是一个对象,可以到处传。name特点:用val定义(因为它是值),参数和返回类型写在括号里,=>后面是函数体。我写这篇文章的时候,特意没罗列函数有多少种写法——因为那些语法东西,查文档就有。Scala为什么要有函数这个概念?不是因为"函数式编程嘛,函数是一等公民"——这句话说了等于没说。当你需要对一组数据做变换的时候,你需要一个"可以传进去的操作"。

https://starzy1990.github.io/ 703

大数据Spark(八十三):Spark中的分区器Partitioner介绍

本文介绍Spark中Partitioner的作用及三种实现方式:HashPartitioner(基于哈希取模,默认分区器,高效但易倾斜)、RangePartitioner(按键范围分区,支持排序,数据均衡性好)和自定义分区器(按业务规则分配,灵活应对特殊需求)。合理选择分区器可优化shuffle性能,提升作业效率。

Lansonli(蓝深李)的博客 575
上一篇: JMM(Java内存模型)中的核心概念
下一篇: Actors in Scala(Scala中的Actor)(预打印版) 第一章 Concurrency Everywhere (B)
Guibin
博客等级 码龄23年 45粉丝 13原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值