介绍
关于generator的一点新想法
# 任务并行
我之前写了那个多线程计算,写了一大堆,还强行写了个锁出来,实际上还是多个线程把各自指定的东西做了一遍,没有做到真正任务并行。 我后来想了一下,感觉一是没啥必要,二是任务并行感觉还是要依赖原生的技术去实现,投机取巧不太行(因为明显有一个自动分配的过程。),一时没有想到什么对应的东西,就搁置了
# 一点印象
闲着没事看了一本node的书 主要是看知乎的会员浪费了不太好... 看了目录都是些没意思的东西,再往下看,附录里面写了一个一个node的协程,我当时人都惊了,单线程的东西里面你能给我整协程属实把我整不会了啊。 那一章上来就提了generator,那个时候我就隐约感觉打开了一扇门。 generator常见于koa1和await的实现,但要么是屏蔽了generator的写法,要么是已经过时的技术,基本就没怎么提了,我最早是在忍者那本里面看到这个东西,当时觉得是个很叼的东西,但拿来写了一会,感觉一是不知道用在哪儿,二是用起来蛮费劲,就扔一边了 (实际上我当时唯一的用途就是拿来去做个递归...具体实现就不说了...
# generator
generator其实就是提供了一个挂起的功能,当我不用的时候,我可以将其‘挂起’,用的时候再‘摘下’,这其实暗示了:
- 有类似于缓存的能力
- 可以用于流程的 控制 这都是任务并行需要的东西。并行本身就需要一个共享存储的东西,任务并行需要有个东西去自动分配任务,也就是要对各个线程的流程进行控制。 说累了。。简而言之,最理想的情况就是generator生成一个迭代器,里面就是计算函数,把这个迭代器共享给所有线程,然后,每个线程只需要不断地向迭代器申请,取出新的yield即可,最后把各个线程答案集合在一起
假设一个生成器函数,里面有100行计算,每一行前面都是yield,一共四个线程参与计算,那么第一个去计算第一行yield,第二个去...第二轮时,假设第二个线程率先计算完成,只需要接着向迭代器里面申请即可,执行第五行,以此类推
# 难点
这个我手边没空弄,国庆光顾着玩了。。希望实例化的迭代器能共享,如果不行那都是白谈,如果能行,对应的计算内容要怎样安排?如果是复杂的计算,每一行yield后面要怎么写?如果要封装,暴露出来的接口是啥形式比较好?
再说吧。。