Python multiprocessing nutzt nur einen Kern

Ich versuche einen code-snippet aus der standard-python-Dokumentation zu lernen, wie man das multiprocessing Modul. Der code ist eingefügt am Ende dieser Meldung.
Ich bin mit Python 2.7.1 unter Ubuntu 11.04 auf einem quad-core-Maschine (die nach den system-monitor gibt mir die acht Kerne durch hyper threading)

Problem: Arbeitsbelastung scheint geplant zu nur einem Kern, der immer in der Nähe von 100% Auslastung, trotz der Tatsache, dass mehrere Prozesse gestartet werden. Gelegentlich werden alle workload-Migration auf einen anderen core, aber die Arbeitsbelastung ist nie unter Ihnen verteilt.

Irgendwelche Ideen, warum dies so ist?

Beste Grüße,

Paul

#
# Simple example which uses a pool of workers to carry out some tasks.
#
# Notice that the results will probably not come out of the output
# queue in the same in the same order as the corresponding tasks were
# put on the input queue.  If it is important to get the results back
# in the original order then consider using `Pool.map()` or
# `Pool.imap()` (which will save on the amount of code needed anyway).
#
# Copyright (c) 2006-2008, R Oudkerk
# All rights reserved.
#

import time
import random

from multiprocessing import Process, Queue, current_process, freeze_support

#
# Function run by worker processes
#

def worker(input, output):
    for func, args in iter(input.get, 'STOP'):
        result = calculate(func, args)
        output.put(result)

#
# Function used to calculate result
#

def calculate(func, args):
    result = func(*args)
    return '%s says that %s%s = %s' % \
        (current_process().name, func.__name__, args, result)

#
# Functions referenced by tasks
#

def mul(a, b):
    time.sleep(0.5*random.random())
    return a * b

def plus(a, b):
    time.sleep(0.5*random.random())
    return a + b


def test():
    NUMBER_OF_PROCESSES = 4
    TASKS1 = [(mul, (i, 7)) for i in range(500)]
    TASKS2 = [(plus, (i, 8)) for i in range(250)]

    # Create queues
    task_queue = Queue()
    done_queue = Queue()

    # Submit tasks
    for task in TASKS1:
        task_queue.put(task)

    # Start worker processes
    for i in range(NUMBER_OF_PROCESSES):
        Process(target=worker, args=(task_queue, done_queue)).start()

    # Get and print results
    print 'Unordered results:'
    for i in range(len(TASKS1)):
       print '\t', done_queue.get()

    # Add more tasks using `put()`
    for task in TASKS2:
        task_queue.put(task)

    # Get and print some more results
    for i in range(len(TASKS2)):
        print '\t', done_queue.get()

    # Tell child processes to stop
    for i in range(NUMBER_OF_PROCESSES):
        task_queue.put('STOP')

test()
  • Dieser Beitrag kann Ihnen behilflich sein, stackoverflow.com/questions/5784389/...
  • Kopieren und Klebte Ihren code, Maxed out ein Intel Pentium D mit 3.4 GHZ in zwei - /zwei-proc-Bildschirme.
  • Mit denen schläft() gibt, wird diese nicht erzeugen hohe CPU-Last auf alle.
  • Wahr. Ich habe entfernt die schläft und erhöht die Zahl der Arbeitsplätze zu 10000, aber die Arbeitsbelastung ist noch nie verteilt die Kerne. Wenn ich starte 4 Prozesse, bekomme ich drei schlafenden Prozesse und eine vollständig verwertet. Vielen Dank für die Unterstützung Jungs, aber ich konnte nicht viel aus Devrajs link. Ich verstehe, dass es ab der 4 Prozesse ist keine Garantie, dass Sie aufgeteilt werden soll, die Kerne, aber die Ursache dieser polarisierten Verhalten, dass alle Prozesse, ausser man schläft ist mir nicht klar.
  • Noch, mit 10000 Arbeitsplätze, nicht die Arbeit hier Recht schnell vergangen ? Wenn ich einige Messungen auf dieses Programm (achten Sie darauf, entfernen Sie alle Ihre Schleifen, die etwas drucken, brauchen Sie nicht Messen wollen Druck auf den Bildschirm...), dieses Programm verbringt eine Menge Zeit damit, die Liste Verständnis, und Füllung Dinge auf die task_queue. Das nimmt 100% CPU in einem Prozessor für eine Weile. Wenn Sie tatsächlich beginnen die Arbeiter, sich die Dinge zu verwenden, die andere Prozessoren, Aber mit nur 10000 itmes, das wird getan werden, in nur einer Sekunde oder zwei, versuchen 200000.
  • zunächst erstellen Sie eine neue Python-Skript-und design-eine Funktion, die läuft in einem einzigen thread/Prozess, das dauert 100% CPU beim laufen, und das dauert ein paar Sekunden. Danach, verwenden Sie diese Funktion mit multiprocessing.

InformationsquelleAutor Paul | 2011-08-01
Schreibe einen Kommentar