Процесс Python muti работает на процессоре каждого ядра? - PullRequest
1 голос
/ 12 мая 2019

В то же время процессор может запускать только один процесс, если одному процессу потребуется 10 секунд, чтобы завершить работу, двойной процесс завершит ту же работу, это займет 20 секунд (без ожидания ввода-вывода).

Но следующеекод при запуске сбил меня с толку.

#!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 секунд. В результате получается, что оба процесса выполняются одновременно, вкаждое ядро ​​процессора. почему?

1 Ответ

0 голосов
/ 12 мая 2019

Похоже, вы спрашиваете, почему на большее количество процессов уходит больше времени.

Прежде всего, ваша рабочая нагрузка фиксируется для каждого процесса. Многопроцессорность / многопоточность используется для разбиения больших проблем на более мелкие, а затем запускает решения этих небольших проблем в нескольких контекстах (процессах или потоках). В вашем коде вы этого не делаете; Вы выполняете цикл до 300000000 для всех процессов. Если вы сделаете это один раз для одного процесса, это займет столько же времени, сколько если бы вы делали это 4 раза для 4 разных процессов.

Что способствует увеличению времени при увеличении количества процессов, это системный вызов fork (); на Unix-машине это вызов для создания нового процесса. Этот вызов занимает относительно много времени, поскольку он должен копировать все адресное пространство родительского процесса (память для переменных и т. Д.)

Надеюсь, что ответит на ваш вопрос!

...