概述
说明
判断(分支)逻辑与循环功能是一门程序语言必备的两大功能,简单来说就是必须有if
和for
。其中对大量执行任务影响比较大的是for
循环,本篇做一些浅析,并在未来的程序设计中作出针对性的改进。
内容
1 引子
计算机的一大特性是可以以非常高的频率进行逻辑处理/计算等工作,因此当我们有很多任务需要做的时候通常都是以for
丢给计算机执行,对吗?
在单核时代或许有点道理,但事实上cpu还是在for与for
的间隙中浪费大量的时间,所以才有了IO异步,这中间的效率视情况而定,从几倍到几百倍都有可能。
我的理解:for并不是为了简单重复任务而设计的,而是为了迭代。
迭代 != 循环
例如我们在进行MLE计算的时候,要经过很多轮计算才能得到最终结果,每一次计算必须基于上一次计算的结果,这个时候计算机执行的相当于是一个不定循环次数的,很长的一个链条,环环相扣。这时候才是for
的标准应用场景。
2 单机并行
随着计算机cpu核心数不断增多,很自然的就有了利用多核的并行处理方法,例如multiprocessing
和concurrent
之类的包。但是调用起来感觉还是比较奇怪的。另外向numpy之类的包在计算的时候似乎能绕过单核的限制,利用多核计算,可能是c的作用。
这里且不讨论具体实现的方法,而是说如果我们有一串任务列表,我们要如何尽快的完成 。很显然,我们常见的大部分都是无依赖的任务,理论上每个任务都可以分配一个核进行工作。如果把任务发布在数据库中,那么100个任务每个一行,立即出现在任务表中。
另一种情况是任务间有依赖,如果是用字典的形式来看,那么100个任务可能先出现10行任务,某个任务完成后可能又立即蹦进来3个任务,直到100个完全做完。
本质上是按层并行。
3 多机并行
docker是个好东西
由于环境装包还有启停服务是很烦的事情,所以通过制作一个镜像,然后启动多个容器来实现并行。每个容器可以认为是一个单核服务器。机器之间可以利用frp之类的打通,那么就很容易协同了。但要注意的是,除非处理时长/传输时长 > 1, 否则用多机也是不划算的。
好了,总之我们的脚本现在可以通过容器方便的(弹性的)进行扩容,所以问题就变为了要如何组织这样的操作。我们可以在设计程序的时候假想是多机并行的,这样未来部署的时候就不要再改动了。
4 Manager
Manager要“知道”所有的任务以及这些任务间的关系
我们不再用一个for循环去串联所有的任务,而是先把这个长表格交给Manager。
由Manager来决定什么时候,给哪些Worker分发任务。
每个任务需要有一个唯一的id
Note
Manager的Di-Da 时刻:Di时刻检查和计划,Da时刻采取行动
Manager自身是不断循环,直到任务结束的。使用apscheduler可以进行很好的控制,有时候也可以使用cron任务来执行(Manager也是一个docker命令就可以启动)
4.1 Di时刻
- 1 检查任务清单
- 2 检查任务完成情况
- 3 检查可用的资源
- 4 根据策略以及优化方法作出计划(继续分发/终止)
- 5 估计将使用的资源和消耗的时间
- 6 决定是否发出通知(向管理者)
4.2 Da时刻
- 1 终止任务:正常完成以及异常终止。
- 2 继续任务:按之前的方式继续
- 3 获取更多资源或缩减(启动/停止容器)
- 4 发出通知,告知管理者
5 Worker
以回调的方式工作。Manager会将需要的权限、数据以参数形式给到Worker,并给到Worker回调的方法,Worker只需要执行就可以了。
最后
以上就是年轻麦片为你收集整理的Python 集成逻辑7 循环与并行说明内容的全部内容,希望文章能够帮你解决Python 集成逻辑7 循环与并行说明内容所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复