Web crawler - comment coopérer avec les requêtes dans le multi-processus de Python
阿神
阿神 2017-06-22 11:52:30
0
2
779

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 !

阿神
阿神

闭关修行中......

répondre à tous(2)
phpcn_u1582

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal