erlang应该算是面向进程编程的一个语言,erlang从一开始的设计初衷就是解决高并发问题,什么是高并发,说白了,就是很多条进程在同时工作而已(涉及到资源共享),如此说来我们在做erlang的程序的时候一定会遇到同步异步的问题,在面向对象语言里,会遇到回调的问题,就是说我调用你的接口的时候,你也调用了我的接口,这就像我们的这几个行为框架的回调函数!(单纯讨论erlang进程间的同步异步)不过这里不做过多的讨论!
先搞清同步调用,同步调用是一种阻塞调用,如果我在和这个进程通信的时候使用的是同步关系,那么,其他的进程对当前进程和其他进程的通信就会出于阻塞状态,直到返回一个返回值给主动调用的进程,如果未设置超时处理,那么被调用的进程会一直阻塞! 什么时候用同步调用呢?假设我们的一个人物进程,人物身上有战斗力,那么战斗力是RoleInfo里的一个部分,当做状态,这是由很多种方法可以改变战斗力,例如强化武器,镶嵌宝石,升级宠物,那么假设我忽然同事对他进行了操作会怎么样,这个时候我们很难控制处理顺序,应该说是无法控制,结果就是可能两个进程同事使用了统一状态的战斗力然后在重写战斗力状态的时候相互覆盖,最后导致战斗力数值失真,那么这个时候我们就回去使用同步调用这种阻塞的方式!
什么时候我们调用异步调用呢?这个很难说,因为在我的眼里,只要对数据准确性不构成风险,并且不需要及时返回的我都可以使用异步调用,就像创建一个队伍,这个时候要想ets里加入队伍编号,那么我们给队伍这个进程发送一个队伍编号过去,告诉队伍进程加入一个队伍编号即可,我们其实并不关心这个编号加入的先后顺序,因为我们无论如何加入,都不会影响数据的准确性的问题!
关于id,这里的id指的是物品任务的唯一标识,就像班级编号一样的主键,在erlang中特别是ets里,没有像大型数据库那种自动编号的能力,那么完成编号的操作就要有我们自己来处理,打个比方,当我们新建了一个角色,那么我们需要生成一个roleid,这个时候怎么办?一般情况下我们会使用文本操作来处理,在文本中计数,然后使用同步的方法(阻塞调用),每次新角色创建,我们就去调用文本计数的进程将这个数+1,这样就可以保证数据的唯一性,最后再像Menisa中插入或者像地图ets中插入的时候就不会出现相同的编号!