数据互补

以事件池为载体,在各个事件流之间传输数据

有了数据关联,就意味着我们可以在并发一个事件流的时候让多个task进行数据交换。但是在进行对事件池的并发时,我们应该如何去对多个event作数据的传输呢?

答案就是数据互补。

数据互补

数据互补可以在一个事件流被并发时,将事件流内指定的task的返回值传输到事件流所属事件池中,另外一些指定事件池的returns字典中。

您可以在事件流的association成员中配置该事件流的数据互补系统。

格式:

{要传输返回值的task名称(该事件流内) : [要传输到的事件流名称 , 要传输到的事件流名称二......]}

如上所示,一个task的返回值可以传输到多个事件流内。在同时进行数据关联和数据互补时,task会首先将数据放入所属事件流的returns字典中,然后再将数据从returns字典中抽出进行数据互补。这意味着您可以使用returnFunc对互补的数据进行额外操作。

在传输方的task完成传输后,数据只会被送往指定事件流的returns字典中。所以您需要对其他事件流内的task进行数据关联的设置。将其association成员设为传输方task的名称。最后,整个数据互补的流程就结束了。您也可以使用接收方task的associationFunc进行对数据的二次处理。

一切数据互补的操作都由底层单位task实现,event和eventPool只作成员变量的配置参考。task在查找别的事件流并在其returns字典中放入数据时,会先定位到self.event,再定位到self.event.eventPool,在self.event.eventPool.events中查找需要关联的事件流。所以如果想要进行数据互补,task和事件流的所属事件流、事件池必须要设置正确,并确保所有单位都有一个独立的名称。

给所有task,event都设立一个独立的名称是一个非常好的习惯。因为它们靠各自的名字辨认彼此。

通用流程

了解了数据互补后,以下是数据互补常用的流程代码。

import turingAPI
user = turingAPI.icodeUser('a cookie')   #登录
ep = turingAPI.eventPool()  #创建事件池
turingAPI.addEvent(ep,name='ev1',association={'work':['ev2']})  #增加ev1事件流,配置数据互补

def data(value,self):   #定义returnFunc(getPersonWorks结果转化为comment参数)
    return [[value[0]['id'],'Hello World'],{}]   #按格式返回

turingAPI.addTask(ep.events[0],user.getPersonWorks,'work',[user.info['userId'],1,1,True],{},data)
#向ev1中增加task“work”。用于获取用户作品数据,并进行数据互补。
turingAPI.addEvent(ep,name='ev2')
#增加ev2事件流
turingAPI.addTask(ep.events[1],user.comment,'comment',association='work')
#向ev2中增加task“comment”。用于对用户作品进行评论。接收work的数据。

ep.run()

Last updated