并行的边界

七月份忙的狗一样,还一度要12点赶回公司修bug,真累。。。

入职以来的这两个月,一直在业务层摸索,苦于没有文档,rpc协议、单件服务的启动、为热更新去准备的环境变量等等,都要一一在摸索中问出来。幸而,终于走过了这一段。这也促使我开始思考,skynet、gevent、golang之间,各自的优点和缺点是什么。

先从skynet说起,最直观的感受是,skynet在lua/c里几乎完全复制了python的标准库。上至打包用的serialize、json库,下至打印字典(table)的prettyprint,都实现了一遍。所以,使用过程还是比较愉快的,前提是你找到了这个库。。另外,底层rpc使用了Google的protobuf负责打包,实际使用中发现,我们基本就用int32和string,枚举和布尔值也用的不多。其实就跟上家公司一样,对rpc只要支持字符串、整型、数组和自定义结构体就够了。protobuf单个结构的定义过程和标准的一样,不同的是协议的定义。使用了一个protolist文件标记所有的协议,然后又分默认写法、请求为空写法、回复为空写法。与其支持这么多东西,倒不如直接全部自己定义,不搞默认值那一套了。

最令人蛋疼的,是服务之间的交互。起服务的时候,要记得在两个地方注册,因为skynet有集群模式和单机模式的区别。然后服务之间交互,需要手动写call,告诉skynet我调的服务叫什么名字,如果没有名字就传一个固定的id进去识别。然后写完逻辑,返回数据的时候,要记得用skynet retpack一下,要不发出请求的服务就会一直卡在等待状态,而且没有任何报错提示。如果说受限于lua的语法,不方便增加新的写法以表明跨越了协程,至少我写完call,skyne返回数据的时候能打包吧?据说,这个支持是为了在函数体中间给skynet返回结果,再继续做其他事用的。但是这种想象中的灵活写法,为业务层开发带来了隐含的信息假设,而项目又没有文档说明这个事情。

对于skynet的agent模式,我还是比较欣赏的。但是和gevent、golang不同,跨agent之间的通信需要显式调用底层的接口,这就比较疼了。我希望agent服务能够有自己的超时机制,如果跨agent的调用过一段时间没有返回,至少你给我个提示信息来查一下嘛。往大里做的话,还需要给agent的相互调用添加监视,控制调用频率、是否重试等等。作为分布式系统,其实是将单进程/单线程的复杂性转移到整个架构部署的复杂度上来,这样每个服务会变简单,复杂性就体现在服务的交互过程和服务本身的维护上了。

golang没有显式的标记一个服务,任何函数只要用go这个关键字去跑,就可以作为一个协程单独跑起来。交互的时候,使用了channel这种东西去告诉底层,发生了一个跨越边界的消息传递。而gevent则是通过spawn这个函数去跑起一个新的greenlet作为协程。由于不会跨越线程/进程边界,gevent也不需要对消息传递进行特殊处理,只要按普通函数的调用来做就好了。

综合来看,显式指定并行的边界,有助于底层并发的优化,但是没有合适的语法糖和基础设施,写业务的时候就会觉得好累了。

并行的边界

时间: 2024-11-10 18:19:00

并行的边界的相关文章

Make R-CNN论文学习

在论文是在Faster R-CNN的基础上的改进 ,实现的效果有: 目标检测:能够在输入图像中绘制出目标的边界框,预测目标位置 目标分类:判别出该划定边界的目标的类别是什么,如人.车.猫和狗等类别 像素级目标分割:(这就是其比Faster R-CNN多出的一个功能)能够在像素层面上对目标进行区分,将目标和背景区分开来,并使用不同的颜色进行标记 如Faster R-CNN的检测结果为: 而mask R-CNN的检测结果为: 可见mask R-CNN还能够将框中具体的目标部分使用同种颜色标记出来 m

编写高质量代码改善C#程序的157个建议——建议89:在并行方法体中谨慎使用锁

建议89:在并行方法体中谨慎使用锁 除了建议88所提到的场合,要谨慎使用并行的情况还包括:某些本身就需要同步运行的场合,或者需要较长时间锁定共享资源的场合. 在对整型数据进行同步操作时,可以使用静态类Interlocked的Add方法,这就极大地避免了由于进行原子操作长时间锁定某个共享资源所带来的同步性能损耗.回顾建议83中的例子. static void Main(string[] args) { int[] nums = new int[] { 1, 2, 3, 4 }; int total

翻新并行程序设计的认知整理版(state of the art parallel)

近几年,业内对并行和并发积累了丰富的经验,有了较深刻的理解.但之前积累的大量教材,在当今的软硬件体系下,反而都成了负面教材.所以,有必要加强宣传,翻新大家的认知. 首先,天地倒悬,结论先行:当你需要并行时,优先考虑不需要线程间共享数据的设计,其次考虑共享Immutable的数据,最糟情况是共享Mutable数据.这个最糟选择,意味着最差的性能,最复杂啰嗦的代码逻辑,最容易出现难于重现的bug,以及不能测试预防的死锁可能性.在代码实现上,优先考虑高抽象级别的并行库(如C++11的future,PP

【MPI学习2】MPI并行程序设计模式:对等模式 & 主从模式

这里的内容主要是都志辉老师<高性能计算之并行编程技术——MPI并行程序设计> 书上有一些代码是FORTAN的,我在学习的过程中,将其都转换成C的代码,便于统一记录. 这章内容分为两个部分:MPI对等模式程序例子 & MPI主从模式程序例子 1. 对等模式MPI程序设计 1.1 问题背景 这部分以Jacobi迭代为具体问题,列举了三个求解Jacobi迭代问题的MPI对等模式程序. 这里需要阐明一下,书上的Jacobi迭代具体的背景可以参考这个内容:http://www.mcs.anl.g

h.264并行解码算法2D-Wave实现(基于多核非共享内存系统)

在<Scalable Parallel Programming Applied to H.264/AVC Decoding>书中,作者基于双芯片18核的Cell BE系统实现了2D-Wave并行解码算法. Cell BE架构 首先来了解一下Cell BE.Cell BE全称为Cell Broadband Engine,是一种微处理器架构,Cell处理器由索尼.东芝.IBM共同研发,曾应用于PlayStation 3.Cell BE的架构如下图 一个Cell微处理器中共有9个核心,其中有1个PP

h.264并行解码算法分析

并行算法类型可以分为两类 Function-level Decomposition,按照功能模块进行并行 Data-level Decomposition,按照数据划分进行并行 Function-level Decomposition 在h.264解码时进行功能划分,例如对于四核系统,各个核心分别执行下列任务 熵解码framen 逆量化.逆变换framen-1 预测处理framen-2 去块滤波framen-3 这种并行类型就是流水线类型,但这种类型在h.264解码中会出现以下问题 各个功能部分

卷积操作的GPU粗粒度并行实现及测试

一.    算法基本思想: 1.           GPU中的一个线程产生一个卷积结果,有多少个结果就使用多少个Block; 2.           矩阵和卷积核存放在共享内存中,卷积结果存放在全局内存中: 3.           支持10000以内任意维度的二维矩阵,卷积核最大支持16x16. 4.           支持任意多幅图像的批处理. 二.    实验平台: CPU:Intel(R) Xeon(R) E5-2650 0 @2.00GHz 16核 32线程 GPU:NVIDIA

卷积操作的GPU粗粒度并行实现及测试(优化)

A.边界扩展: B.字块对齐. Matrix Size Number Kernel CPU(s) CPU2GPU GPU-Kernel GPU2CPU 5x4 1 5x4 <1ms <1ms <1ms <1ms 12x9 1 5x4 <1ms <1ms <1ms <1ms 18x19 1 5x4 <1ms <1ms <1ms <1ms 118x29 1 5x4 <1ms <1ms <1ms <1ms 138x5

边界技术

边界闭合:根据梯度的幅度和方向进行边界闭合. (T是幅度值,A是角度阈值) 这种方法是并行方法,只考虑局部信息,没有考虑全局信息. 这个方法还可以推广用于连接相距较近的间断边缘段和消除独立的(常由噪声干扰产生的)短边缘段. 串行边界技术: 1.边缘检测边缘点边chuanxin 来自为知笔记(Wiz) 边界技术