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
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige, wie die CPU-Affinität wurde geändert. Ich hatte dieses problem mit numpy vor. Ich habe hier die Lösung gefunden
http://bugs.python.org/issue17038#msg180663
Versuchen, anstelle der
time.sleep
mit etwas, das tatsächlich erfordert die CPUs und du wirst sehen, diemultiprocess
funktioniert Prima! Zum Beispiel:multiprocessing bedeutet nicht, dass Sie verwenden werden, alle Kerne eines Prozessors, hat man einfach mehrere Prozesse und nicht multi-core-Prozesse wäre dies erfolgt durch das OS und unsicher ist, die Frage @Devraj gepostet, auf Kommentare Antworten hat, um zu erreichen, was Sie sich wünschen.
Ich gefunden habe, eine Arbeit um über die Parallel-Python. Ich weiß, das ist nicht die Lösung, die mit grundlegenden Python-Bibliotheken, der code ist aber einfach und funktioniert wie ein Charme