[PYTHON] Zusammenfassung der Mehrprozessverarbeitung der Skriptsprache

Überblick

Der Eindruck, dass skalierbarkeitsbewusste Programmierung und Sprachen wie Parallel / Parallel-Verarbeitung, Funktionstyp und Reaktiv in letzter Zeit Aufmerksamkeit erregen. Daher werde ich die grundlegende Schreibmethode der Mehrprozessverarbeitung unter Verwendung von drei Arten von Skriptsprachen zusammenfassen, die häufig in der Webentwicklung verwendet werden.

Umgebung

Sprache

Ausführungsumgebung

Vagrantfile


config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024", "--cpus", "4", "--ioapic", "on"]
  end

CPU-Bestätigungsbefehl

top -d1
#Drücken Sie 1, um alle CPUs anzuzeigen

Ruby

Beispielcode

require "digest/md5"
require "securerandom"
require 'benchmark'

pcount = 4

def single(pcount)
    (pcount - 1).times do
        arr = []
        100000.times do
            arr << Digest::MD5.digest(SecureRandom.uuid)
        end
    end
end

def multi(pcount)
    pids = []
    (pcount - 1).times do
        #Prozessgenerierung
        pids << fork do
            arr = []
            100000.times do
                arr << Digest::MD5.digest(SecureRandom.uuid)
            end
        end
    end

    Process.waitall

end

single_time = Benchmark.realtime do
    single(pcount)
end
print single_time.to_s() + "\n"

multi_time = Benchmark.realtime do
    multi(pcount)
end
print multi_time.to_s() + "\n"

CPU-Auslastung

Einzelner Prozess

Cpu0  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Multi-Prozess

Cpu0  : 99.0%us,  1.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  : 99.0%us,  1.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  : 99.0%us,  1.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Ergebnis

Python

Beispielcode

import multiprocessing as mp
import hashlib
import uuid
import time
import os

def create_hash(res=[]):
    print('created: ' + str(os.getpid()))
    for _ in range(100000):
        res.append(hashlib.md5(str(uuid.uuid4()).encode('utf8')).hexdigest())
    return res

def single(pcount):
    start_time = time.time()
    print('parent: ' + str(os.getpid()))
    res = []
    for _ in range(pcount):
        res = create_hash(res)
    end_time = time.time()
    print('all finished : ' + str(end_time - start_time))

def multi(pcount):
    start_time = time.time()
    print('parent: ' + str(os.getpid()))
    processes = []
    for _ in range(pcount):
        processes.append(mp.Process(target=create_hash, args=()))

    for process in processes:
        process.start()

    for process in processes:
        process.join()

    end_time = time.time()
    print('all finished : ' + str(end_time - start_time))

if __name__ == '__main__':
    pcount = 4
    single(pcount)
    multi(pcount)

CPU-Auslastung

Einfacher Prozess

Cpu0  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Multi-Prozess

Cpu0  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  : 99.0%us,  1.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Ergebnis

PHP

Beispielcode

//Übergeordneter Prozess+Untergeordneter Prozess=4 Prozesse
$pcount = 3;

function single($pcount) {
    $time_start = microtime(true);
    $res = [];
    echo 'parent : '.getmypid()."\n";

    foreach(range(0, $pcount - 1) as $i) {
        echo 'created : '.getmypid()."\n";

        foreach(range(0, 100000) as $ii) {
            $res[] = md5(uniqid(mt_rand(), true));
        }
    }

    $time_end = microtime(true);
    $time = $time_end - $time_start;

    echo "all finished : $time\n";
}

function multi($pcount) {
    $processes = [];
    $time_start = microtime(true);
    echo 'parent : '.getmypid()."\n";

    foreach(range(0, $pcount - 1) as $p) {
        //Hier ist es in einen übergeordneten und einen untergeordneten Prozess unterteilt.
        //Wenn es dem übergeordneten Prozess gelingt, einen untergeordneten Prozess zu erzeugen, wird die PID dieses Prozesses angezeigt_ICH WÜRDE
        //Wenn du verlierst-Holen Sie sich 1
        //Der untergeordnete Prozess erhält 0
        $pid = pcntl_fork();

        //Fehler beim Erstellen des untergeordneten Prozesses
        if ($pid === -1) {
            echo 'Failed process fork';
            exit;
        }

        //Verarbeitung von untergeordneten Prozessen
        if ($pid === 0) {
            $res = [];

            foreach(range(0, 100000) as $i) {
                $res[] = md5(uniqid(mt_rand(), true));
            }
            echo 'created : '.getmypid()."\n";
            exit;
        }

        //Verarbeitung des übergeordneten Prozesses
        $processes[] = $pid;
    }

    foreach($processes as $process) {
        pcntl_waitpid($process, $status);
    }

    $time_end = microtime(true);
    $time = $time_end - $time_start;

    echo "all finished : $time\n";
}

single($pcount);
multi($pcount);

CPU-Auslastung

Einzelner Prozess

Cpu0  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  1.0%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  1.0%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Multi-Prozess

Cpu0  :  1.0%us,  0.0%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  : 99.0%us,  0.0%sy,  0.0%ni,  1.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  : 97.0%us,  1.0%sy,  0.0%ni,  2.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  : 96.1%us,  1.0%sy,  0.0%ni,  2.0%id,  0.0%wa,  0.0%hi,  1.0%si,  0.0%st

Ergebnis

Zusammenfassung

Recommended Posts

Zusammenfassung der Mehrprozessverarbeitung der Skriptsprache
100 Amateur-Sprachverarbeitungsklopfen: Zusammenfassung
[Sprachverarbeitung 100 Schläge 2020] Zusammenfassung der Antwortbeispiele von Python
100 Sprachverarbeitung Knock-59: Analyse der S-Formel
Installationszusammenfassung des Analysators für die Verarbeitung natürlicher Sprache
Antworten und Eindrücke von 100 Sprachverarbeitungsklopfen - Teil 1
100 Sprachverarbeitung Knock-91: Vorbereitung von Analogiedaten
Sprachverarbeitung 100 Knocks-44: Visualisierung abhängiger Bäume
Verarbeiten Sie den Namen der Yugioh-Karte in natürlicher Sprache - Yugiou Data Science 2. NLP
100 Sprachverarbeitung Knock-22: Extraktion des Kategorienamens
Antworten und Eindrücke von 100 Sprachverarbeitungsklopfen - Teil 2
100 Sprachverarbeitung Knock-26: Entfernen von hervorgehobenem Markup
Zusammenfassung der Hosting-Seiten der Bibliothek nach Sprache
100 Sprachverarbeitungsklopfen 03 ~ 05
100 Sprachverarbeitungsklopfen (2020): 40
100 Sprachverarbeitungsklopfen (2020): 32
100 Sprachverarbeitungsklopfen (2020): 35
100 Sprachverarbeitungsklopfen (2020): 47
100 Sprachverarbeitungsklopfen (2020): 39
100 Sprachverarbeitungsklopfen (2020): 22
100 Sprachverarbeitungsklopfen (2020): 26
100 Sprachverarbeitungsklopfen (2020): 34
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen (2020): 29
100 Sprachverarbeitungsklopfen (2020): 49
100 Sprachverarbeitungsklopfen 06 ~ 09
100 Sprachverarbeitungsklopfen (2020): 43
100 Sprachverarbeitungsklopfen (2020): 24
100 Sprachverarbeitungsklopfen (2020): 45
100 Sprachverarbeitungsklopfen (2020): 10-19
100 Sprachverarbeitungsklopfen (2020): 30
100 Sprachverarbeitungsklopfen (2020): 00-09
100 Sprachverarbeitungsklopfen (2020): 31
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitungsklopfen (2020): 48
100 Sprachverarbeitungsklopfen (2020): 41
100 Sprachverarbeitungsklopfen (2020): 37
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitungsklopfen (2020): 25
100 Sprachverarbeitungsklopfen (2020): 33
100 Sprachverarbeitungsklopfen (2020): 27
100 Sprachverarbeitungsklopfen (2020): 46
100 Sprachverarbeitungsklopfen (2020): 21
100 Sprachverarbeitungsklopfen (2020): 36
Sprachverarbeitung 100 Schläge-45: Extraktion von Verbfallmustern
100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
Zusammenfassung der Pickle- und Unpickle-Verarbeitung von benutzerdefinierten Klassen
Unerträgliche Aufmerksamkeitsmangel bei der Verarbeitung natürlicher Sprache
100 Amateur-Sprachverarbeitungsklopfen: 41
100 Amateur-Sprachverarbeitungsklopfen: 71
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 56
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 50
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 59
100 Amateur-Sprachverarbeitungsklopfen: 70
100 Amateur-Sprachverarbeitungsklopfen: 62
100 Amateur-Sprachverarbeitungsklopfen: 60
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 92