Python中能否为特定任务分配更多工作进程?树莓派异耗时双任务并行优化
可行性结论
可以通过为任务'A'配置多工作进程的方式提升处理效率,你预设的1核下载、1核跑任务'a'、2核跑任务'A'的资源分配方案完全可以满足40秒下载间隔的处理要求,不会出现任务积压。
实现思路
采用生产者-消费者架构解耦三个环节,全程使用常驻进程代替临时启动进程,消除进程启停的额外开销:
- 启动1个常驻下载进程,专门负责从FTP拉取文件,每完成1个文件下载就把文件路径分别推到任务a队列和任务A队列两个独立的进程安全队列中。下载本身是IO密集型,占1核的实际CPU使用率极低,不会挤占其他任务的计算资源。
- 启动1个常驻的任务'a'处理进程,循环从任务a队列取任务执行。因为单任务耗时不足10秒,远小于40秒的下载间隔,完全不会出现任务积压。
- 启动2个常驻的任务'A'工作进程,共享任务A队列并行取任务执行:
- 如果任务'A'是CPU密集型,2个进程刚好占满2个分配的核心,平均处理速率为每20秒完成1个任务,远高于每40秒新增1个任务的速度,就算单任务偶尔跑到40秒的上限,也不会出现长期积压
- 如果任务'A'是IO密集型(存在大量磁盘读写、外设调用等等待场景),可以适当开3-4个工作进程,利用IO等待的空闲时间处理更多任务,进一步提升吞吐量
- 可选优化:用
os.sched_setaffinity接口把不同进程绑定到指定的物理核心,避免系统调度进程在核心间来回切换带来的性能损耗,参考代码:
import os # 示例:将当前进程绑定到第0号CPU核心 os.sched_setaffinity(os.getpid(), [0])
注意事项
- 树莓派4为4物理核心无超线程,所有任务的总进程数不要超过4,否则会引发大量上下文切换,反而拉低所有任务的执行效率
- 可以给队列设置最大长度(比如最多存3个待处理任务),如果队列满就暂时阻塞下载进程,避免异常场景下任务积压占满内存
内容的提问来源于stack exchange,提问作者Lanas
相关产品推荐
相关产品推荐

