
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
多进程技术的应用在许多软件开发项目中都是会经常遇到的一个技术,而本文我们就通过案例分析来简单了解一下,多进程技术应用注意事项分析。
多进程:设计好计算单元,应尽可能小
我们来设想一个场景,假设你有10名员工,同时你有10项工作,每项工作中,都由相同的5项子工作组成。你会如何来做安排呢?理所当然的,我们应该把这10名员工,分别安排到这10项工作中,让这10项工作并行执行,没毛病,对吧?但是,在我们的项目中,如果这样来设计并行计算,很可能出问题。
这里是一个真实的例子,后性能提升的效果很差。原因是什么呢?(此处可按Pause键,思考一下)
主要的原因有2个,并行的计算单元颗粒度不应太大,大了以后,通常会有数据交换或共享问题。其次,颗粒度大了以后,完成时间会差别比较大,形成短板效应。也就是,颗粒度大了以后,任务完成时间可能会差别很大。
在一个真实的例子中,并行计算需要1个小时,后分析后才发现,只有一个进程需要1小时,而其他进程的任务都在5分钟内完成了。
另一个好处是,出错了,好定位,代码也好维护。所以,计算单元应尽可能小。
多进程:避免进程间通信或同步
当我们把计算单元设计的足够小后,应该尽量避免进程间通信或同步,避免造成等待,影响整体执行时间。
多进程:调试是个问题,除了log外,尝试gdb/pdb
并行计算的公认问题是,难调试。通常的IDE只可以中断一个进程。通过打印log,并加上pid,来定位问题,会是一个比较好的方法。注意,并行计算时,不要打太多log。如果你按照上面讲的,先调通了单进程的实现,那么这时,重要是,打印进程的启动点,进程数据和关闭点,就可以了。比如,观测到某个进程拖了大家的后腿,那就要好好看看那个进程对应的数据。
这是个细致活,特别是,当多进程启动后,可能跑着数小时,你也不知道在发生什么?可以使用linux下的top,或windows下的activity等工具来观测进程的状态。也可以使用gdb/pdb这样的工具,进入某个进程中,看看卡在哪里。
多进程:避免大量数据作为参数传输
在真实的项目中,我们设计的计算单元,不会像上面的简单例子一样,通常都会带有不少参数。这时需要注意,当大数据作为参数传输时,会导致内存消耗很大,并且,子进程的创建也会很慢。
多进程:Fork?Spawn?
Python的多进程支持3种模式去启一个进程,分别是,spawn,fork,forkserver。他们之间的差别是启动速度,和继承的资源。spawn只继承必要的资源,而fork和forkserver则与父进程完全相同。
依赖于不同的操作系统,和不同版本的python,其默认模式也不同。对python3.8,Windows默认spawn;从python3.8开始,macOS也默认使用spawn;Unix类OS默认fork;fork和forkserver在windows上不可用。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。