Ich habe den folgenden Code geschrieben, um "500 Dateien parallel herunterzuladen" in Python.
from time import sleep
from concurrent.futures import ThreadPoolExecutor
def func(i):
#Eigentlich Datei-Download-Prozess
sleep(1)
print(f"{i}\n", flush=True, end="")
with ThreadPoolExecutor(max_workers=3) as executor:
for i in range(500):
# 0~Laden Sie die Datei 499 parallel herunter
executor.submit(
lambda: func(i)
)
Als ich dies ausführte, war das Verhalten wie folgt: "Die Verarbeitung wird viele Male mit derselben Nummer ausgeführt".
499
499
499
499
499
499
144
145
146
1
0
2
(Unten weggelassen)
Anscheinend "wird der Wert von" i "gelesen, wenn func tatsächlich ausgeführt wird, so viele Werte von" i "am Ende der Schleife werden gelesen."
Wenn Sie "functools.partial" wie unten gezeigt verwenden, wird es wie ursprünglich erwartet ausgeführt: "Führen Sie die Verarbeitung mit allen Werten von" i "von 0 bis 499 durch".
from time import sleep
from functools import partial
from concurrent.futures import ThreadPoolExecutor
def func(i):
sleep(1)
print(f"{i}\n", flush=True, end="")
with ThreadPoolExecutor(max_workers=3) as executor:
for i in range(500):
executor.submit(
partial(func, i)
)
Die Ausgabe sieht so aus.
0
2
1
3
5
4
6
7
8
9
10
11
12
13
14
(Unten weggelassen)
Wie ich aus diesem Blog erfahren habe, ist dies auch das Standardargument von Python Es scheint einen Weg zu geben, sich zu binden. Ich denke, es ist einfacher, die Absicht des Programms mit "partiell" zu vermitteln, aber es ist sicherlich interessant.
from time import sleep
from concurrent.futures import ThreadPoolExecutor
def func(i):
sleep(1)
print(f"{i}\n", flush=True, end="")
with ThreadPoolExecutor(max_workers=3) as executor:
for i in range(500):
executor.submit(
lambda x=i: func(x)
)
Von einem Freund " submit
erhält das Argument der auszuführenden Funktion Aber dann Ich bekam einen Tsukkomi, der sagte: "Ist es nutzlos?", Aber ich denke, das ist genau der Fall. Hier ist der Code für den tatsächlichen Gebrauch.
with ThreadPoolExecutor(max_workers=3) as executor:
for i in range(500):
executor.submit(func, i)
Recommended Posts