895 Stimmen

Wie man multiprocessing pool.map mit mehreren Argumenten verwendet

In der Python multiprocessing Bibliothek, gibt es eine Variante von pool.map die mehrere Argumente unterstützt?

import multiprocessing

text = "test"

def harvester(text, case):
    X = case[0]
    text + str(X)

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=6)
    case = RAW_DATASET
    pool.map(harvester(text, case), case, 1)
    pool.close()
    pool.join()

12 Stimmen

Zu meiner Überraschung konnte ich weder die partial noch lambda dies tun. Ich denke, es hat mit der seltsamen Art und Weise zu tun, wie Funktionen an die Unterprozesse übergeben werden (über pickle ).

15 Stimmen

@senderle: Dies ist ein Fehler in Python 2.6, der aber mit 2.7 behoben wurde: bugs.python.org/issue5228

3 Stimmen

Ersetzen Sie einfach pool.map(harvester(text,case),case, 1) von: pool.apply_async(harvester(text,case),case, 1)

0voto

Omar Khan Punkte 81

Speichern Sie alle Ihre Argumente als Array von Tupeln .

Das Beispiel sagt, dass Sie normalerweise Ihre Funktion als aufrufen:

def mainImage(fragCoord: vec2, iResolution: vec3, iTime: float) -> vec3:

Übergeben Sie stattdessen ein Tupel und entpacken Sie die Argumente:

def mainImage(package_iter) -> vec3:
    fragCoord = package_iter[0]
    iResolution = package_iter[1]
    iTime = package_iter[2]

Bauen Sie das Tupel auf, indem Sie vorher eine Schleife verwenden:

package_iter = []
iResolution = vec3(nx, ny, 1)
for j in range((ny-1), -1, -1):
    for i in range(0, nx, 1):
        fragCoord: vec2 = vec2(i, j)
        time_elapsed_seconds = 10
        package_iter.append((fragCoord, iResolution, time_elapsed_seconds))

Dann führen Sie alle mit map aus, indem Sie die Array von Tupeln :

array_rgb_values = []

with concurrent.futures.ProcessPoolExecutor() as executor:
    for val in executor.map(mainImage, package_iter):
        fragColor = val
        ir = clip(int(255* fragColor.r), 0, 255)
        ig = clip(int(255* fragColor.g), 0, 255)
        ib = clip(int(255* fragColor.b), 0, 255)

        array_rgb_values.append((ir, ig, ib))

Ich weiß, Python hat * y ** zum Auspacken, aber die habe ich noch nicht ausprobiert.

Außerdem ist es besser, die übergeordnete Bibliothek concurrent futures zu verwenden als die untergeordnete Bibliothek multiprocessing.

-2voto

Hz Shang Punkte 85

Für Python 2 können Sie diesen Trick anwenden

def fun(a, b):
    return a + b

pool = multiprocessing.Pool(processes=6)
b = 233
pool.map(lambda x:fun(x, b), range(1000))

0 Stimmen

Warum b=233. den Zweck der Frage verfehlt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X