在python任务中,我们考虑两个因素,进程数和任务数,通过这两个因素来总结当前任务执行过程中的几种常用解决方案
单任务t | 多任务nt | |
单进程p | pt | pnt |
多进程np | npt | npnt |
在上述模型当中,单任务单进程,对于开发者而言,是最简单的模型,无论是出于什么样的选择,在当前只能是顺序执行,对于效率而言,只能是通过对任务本身进行调整。
单进程多任务,顺序执行其实也是唯一的选择,由于这里我们只考虑进程和任务本身,对于其他的因素未做别的考虑,所以顺序执行就变成了唯一的选择,而且在执行过程中,由于模型简单的原因,导致问题不会太多,但其实在运行的过程中,如果我们去考虑其他更多的因素,就会发现会有许多值得去讨论的问题,如多个任务是顺序执行还是交替执行?以及交替的策略。再仔细考虑一下就会发现所有的变化其实都发生在任务端,变化都是由于任务的变化而引起,所以对于任务的调整至关重要。任务其实有多种形式,在当前的开发模式下,也有几种,一种是长任务,如web服务,一种是任务切片,如处理从kafka过来的消息(任务切片模式)等
多进程单任务,这个模型中的难点就是任务的拆分,一个任务分给多个进程执行,最难的点就在于任务的拆分,如何把一个任务分配给多个进程去执行。如一个大文件内容操作,常规我们操作是先把数据读取到内存中,然后再进行相关操作。读——》操作。如果我们采用多进程去操作,那就是先把数据读取到内存中,然后再对数据进行切片,然后分配到不同的进程去操作。读——》切片——》操作。增加了切片时间,减少了操作时间。当然,在这里其实就可以有许多不同的方案了,比如读数据的时候就可以启动多个进程去读,在这里其实还有一个需要确认的地方,多个进程读出来的数据对象,是一个数据对象还是变为多个数据对象了,这个是比较关键的。这里其实已经是涉及到分布式处理了。
多进程多任务,处理难度更高,但整体方案和多进程单任务其实差不太多,但是需要再添加一层去处理,就像是我们处理数据库一样,刚开始处理单表,后来需要处理一个schema,一个schema下对应有多张表,再后来就需要处理一个库,一个库下有多个schema,类似于这种层级结构。
这里先做简单的模型总结,后续出对应的详细解决方案。