Voici le code pour l'exécution séquentielle d'un seul processus :
import requests,time,os,random
def img_down(url):
with open("{}".format(str(random.random())+os.path.basename(url)),"wb") as fob:
fob.write(requests.get(url).content)
urllist=[]
with open("urllist.txt","r+") as u:
for a in u.readlines():
urllist.append(a.strip())
s=time.clock()
for i in range(len(urllist)):
img_down(urllist[i])
e=time.clock()
print ("time: %d" % (e-s))
Voici le code du multi-processus :
from multiprocessing import Pool
import requests,os,time,random
def img_down(url):
with open("{}".format(str(random.random())+os.path.basename(url)),"wb") as fob:
fob.write(requests.get(url).content)
if __name__=="__main__":
urllist=[]
with open("urllist.txt","r+") as urlfob:
for s in urlfob.readlines():
urllist.append(s.strip())
s=time.clock()
p=Pool()
for i in range(len(urllist)):
p.apply_async(img_down,args=(urllist[i],))
p.close()
p.join()
e=time.clock()
print ("time: {}".format(e-s))
Mais il n'y a presque aucune différence entre le temps passé en processus unique et en multi-processus. Le problème est probablement que les requêtes bloquent les E/S. Votre compréhension est-elle correcte ? Comment le code doit-il être modifié pour atteindre l'objectif du multi-processus ?
Merci !
Le goulot d'étranglement de l'écriture de fichiers est l'E/S du disque, pas le CPU. Le parallélisme n'a pas beaucoup d'effet. Vous pouvez essayer de ne pas écrire de fichiers et comparer les temps.
Le pool sans paramètres utilise
os.cpu_count() ou 1
S'il s'agit d'un processeur monocœur ou si le numéro ne peut pas être collecté, il n'y a qu'un seul processus.
Cela devrait être la raison.