python-3.x - python muti 进程在处理器的每个内核上运行?
问题描述
同时处理器只能运行一个进程,如果一个进程需要 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()
设置 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
设置 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
设置 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
设置 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 核心上同时运行。为什么?
解决方案
听起来您在问为什么更多流程需要更长的时间。
首先,您的工作量对于每个流程都是固定的。多处理/多线程用于将大问题分解为小问题,然后在多个上下文(进程或线程)上运行这些小问题的解决方案。在您的代码中,您没有这样做;你在所有进程上循环到 mr=300000000。如果您在一个进程上执行一次,所花费的时间与您在 4 个不同进程上执行 4 次所花费的时间相同。
当您增加进程数量时,导致时间增加的原因是 fork() 系统调用;在 Unix 机器上,这是创建新进程的调用。这个调用需要相当多的时间,因为它必须复制父进程的整个地址空间(变量等的内存)。
希望这能回答你的问题!
推荐阅读
- python-3.x - twilio/python/flask: TWIMLET 实现的语音邮件超时?
- visual-studio-code - VSCode:不同的终端帐户
- maven - 带有属性激活配置文件的 maven-release-plugin
- excel - 在 Excel 中删除点并保持前导零
- mysql - 使用 OCI 和 MySQL 构建 DLL 和 LabView 一直失败
- rstudio - 手动编辑 RStudio 词典中的拼写条目
- docker - 如何在 Spinnaker 中将 Jfrog Artifactory 添加为 docker 注册表?
- swift - Xcode 10 错误:链接器命令失败,退出代码为 1
- python - PyQt5:使用类创建 Windows
- javascript - 如何检测我的 iFrame 是否被其他网站使用?