【问题标题】:python muti process runs on processor each core ?python 多进程在每个内核的处理器上运行?
【发布时间】:2019-09-29 12:40:52
【问题描述】:

同时处理器只能运行一个进程,如果一个进程需要10秒完成工作,双进程完成相同的工作需要20秒(没有IO等待)。

但是当你运行它时,下面的代码让我很困惑。

#!python3
import time
import os, sys
from threading import Thread
from multiprocessing import Process
import logging
logger = logging.getLogger('TIMER')
formatter = logging.Formatter('%(asctime)s %(msecs)03d : %(message)s')
logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                        #  datefmt='%a, %d %b %Y %H:%M:%S'
                    )
ProcessNum = 1 
def loop():
    start =time.process_time()
    mr = 300000000
    pr = 0
    for i in range(0,mr):
        pr = i
    end = time.process_time()
    logger.warning('pid {} coast time: {}'.format(os.getpid(),str(end-start)[:5] ))


def muti_process():
    for i in range(ProcessNum):
        t = Process(target=loop)
        t.start()
        logger.warning('start.... muti_process')

def muti_threads():
    for i in range(1):
        t = Thread(target=loop)
        t.start()
        logger.warning('start.... muti_threads')

if __name__ == '__main__':
    muti_process()

set ProcessNum = 1 运行你得到的程序

21:18:03,469 process.py[line:29] WARNING start.... muti_process
21:18:14,419 process.py[line:22] WARNING pid 3849 coast time: 10.89

set ProcessNum = 2 运行你得到的程序:

21:18:39,443 process.py[line:29] WARNING start.... muti_process
21:18:39,445 process.py[line:29] WARNING start.... muti_process
21:18:50,638 process.py[line:22] WARNING pid 3856 coast time: 11.14
21:18:50,644 process.py[line:22] WARNING pid 3857 coast time: 11.15

set ProcessNum = 3 运行你得到的程序:

21:19:01,319 process.py[line:29] WARNING start.... muti_process
21:19:01,321 process.py[line:29] WARNING start.... muti_process
21:19:01,324 process.py[line:29] WARNING start.... muti_process
21:19:17,286 process.py[line:22] WARNING pid 3864 coast time: 15.61
21:19:17,415 process.py[line:22] WARNING pid 3863 coast time: 15.78
21:19:17,466 process.py[line:22] WARNING pid 3862 coast time: 15.82

set ProcessNum = 4 运行你得到的程序:

21:19:28,140 process.py[line:29] WARNING start.... muti_process
21:19:28,143 process.py[line:29] WARNING start.... muti_process
21:19:28,147 process.py[line:29] WARNING start.... muti_process
21:19:28,157 process.py[line:29] WARNING start.... muti_process
21:19:48,927 process.py[line:22] WARNING pid 3867 coast time: 19.68
21:19:49,049 process.py[line:22] WARNING pid 3870 coast time: 19.68
21:19:49,085 process.py[line:22] WARNING pid 3869 coast time: 19.65
21:19:49,092 process.py[line:22] WARNING pid 3868 coast time: 19.64

ENV: osx Mojave ,CPU :2.7G core i5(双核)python: Python 3.7.1

运行一个进程需要 10 秒,运行两个进程需要 11 秒。 结果看起来这两个进程在每个 cpu 核心上同时运行。为什么?

【问题讨论】:

  • 操作系统很智能。他们可以将大量进程复用到较少数量的内核上。进一步了解进程调度
  • 我知道进程调度,我只是很困惑为什么多进程可以使用多核,如果设置ProcessNum = 4,这个程序占用400%的cpu使用率。
  • 多处理应该使用多核。操作系统正在尝试使用所有可用的资源来确保进程获得一些 CPU 周期。因此 CPU 使用率为 400%。进程调度是尽力而为

标签: python-3.x process cpu


【解决方案1】:

听起来你在问为什么更多进程需要更长的时间。

首先,每个流程的工作量都是固定的。多处理/多线程用于将大问题分解为小问题,然后在多个上下文(进程或线程)上运行这些小问题的解决方案。在您的代码中,您并没有这样做;你在所有进程上循环到 mr=300000000。如果您在一个进程上执行一次,所花费的时间与您在 4 个不同进程上执行 4 次所花费的时间相同。

当您增加进程数量时,导致时间增加的原因是 fork() 系统调用;在 Unix 机器上,这是创建新进程的调用。这个调用需要相对大量的时间,因为它必须复制父进程的整个地址空间(变量的内存等)。

希望能回答您的问题!

【讨论】:

  • 我只是想弄清楚为什么当您设置 ProcessNum = 1 或 2 时,它几乎在同一时间(大约 11 秒)完成工作。一个进程滑行 10.89 秒,但两个进程仅滑行 11.14 秒,为什么不至少 10.89 * 2 = 11.78 秒? cpu有两个物理核心,好像你设置ProcessNum =2两个进程在每个cpu核心上运行,会发生这种情况吗?
  • 是的,两个进程可以在两个独立的内核上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多