论多进程最聪明的实现方式,让操作系统自动分配核运算

🍉一、前言        

        本人实验的过程中使用的是Python,故使用Python作为例子讲解。

🍉二、解释

        现在绝大多数人选择使用Python开发多进程,往往都会选择一个看似智能,实际很容易出错的mulitprocessing库。
        为什么说这个库容易出错呢?大家都知道,python是一门解释性语言,如果我们开启多个进程,他会给每一个进程生成一个解释器,这些解释器会额外的消耗内存,如果同时运行大量进程,可能会导致系统资源紧张。并且,进程间的通信也会因此受到影响,当多个进程相互等待对方释放资源时可能发生死锁,很容易就会很容易发生一些影响不到的错误。

        python这样的设计模式也并非没有好处,比如催生了Python中的全局解释器锁(GIL)的产生,他虽然维护了线程安全问题,扩展了c等语言的兼容性,并且使用了一种很巧妙简单的方法就做到了内存管理,但他会限制同一时刻只有一个线程执行Python字节码,导致多线程失效,不过在多进程编程中,每个进程都有自己的GIL,反而可以充分利用多核处理器的优势。

        我刚刚说的这些可能出现的情况,很多都是需要我们自己编写代码去处理,预防的。现在有一种办法,可以让我们把这些资源调度,负载均衡的问题丢给一个超级伙伴,他就是专门吃这碗饭的,他绝对比我们厉害的多,他其实一直就在我们身边,慷慨的让我们随意使用,但是大多数人都不知道他的存在,他其实就是——操作系统。

🍉三、实现样例

        我们只需要使用操作系统的命令,让他在后台运行多个.py文件,便可以放心的当甩手掌柜。

在windows下,比如我的CPU有16个核心,可以通过任务管理器查看。那么我就可以创建一个.bat文件,写入以下信息:

@echo off

REM 启动16个进程运行mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py
start cmd /k python mqtt_client.py

然后在终端输入:
 

cmd /c run.bat

便可以大功告成。这样是更加简便,更加智能的一种多进程实现手段。 操作系统会帮我自动分配CPU核心,而不会导致出现一系列资源抢占,死锁问题。

python实现

@echo off

REM 启动16个进程运行mqtt_client.py
start cmd /k python mqtt_client.py
from loguru import logger
import subprocess
import time

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--nums', type=int, default=2, help='video path')
opt = parser.parse_args()

# 定义要运行的进程数量
num_processes = opt.nums

# 计数器,用于给每个进程编号
process_counter = 1
pid_file = 'pids.txt'

start_time = time.time()

# 打开文件准备写入PID
with open(pid_file, 'w') as f:
    # 循环运行指定数量的进程
    for _ in range(num_processes):
        process = subprocess.Popen(['cmd', '/c', 'run.bat'])
        logger.info(f'Process {process_counter} started successfully. PID: {process.pid}')
        f.write(f'{process.pid}\n')
        process_counter += 1

end_time = time.time()
total_time = end_time - start_time

logger.info(f'Total time taken: {total_time}s')

可控制数量,记得把上面16个进程的bat,变成一个进程,使用python循环来控制进程数量,更为合适。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大气层煮月亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值