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.
12 Stimmen
Zu meiner Überraschung konnte ich weder die
partial
nochlambda
dies tun. Ich denke, es hat mit der seltsamen Art und Weise zu tun, wie Funktionen an die Unterprozesse übergeben werden (überpickle
).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)
5 Stimmen
@Syrtis_Major , bitte editieren Sie keine OP-Fragen, die Antworten, die bereits gegeben wurden, effektiv verdrehen. Hinzufügen von
return
àharvester()
hat die Antwort von @senderie als ungenau bezeichnet. Das ist für künftige Leser nicht hilfreich.3 Stimmen
Ich würde sagen, eine einfache Lösung wäre, alle Args in ein Tupel zu packen und es in der ausführenden Funktion zu entpacken. Ich habe dies getan, wenn ich komplizierte mehrere Args an eine Funktion senden musste, die von einem Pool von Prozessen ausgeführt wird.
0 Stimmen
Vielleicht gibt es eine gewisse Komplexität, die ich für diesen speziellen Anwendungsfall vermisse, aber ein Teil funktioniert für meinen ähnlichen Anwendungsfall und ist sehr prägnant und einfach zu verwenden. python.omics.wiki/multiprocessing_map/