En utilisant plusieurs processus pour explorer les données et les écrire dans un fichier, aucune erreur n'est signalée lors de l'exécution, mais le fichier est tronqué lorsqu'il est ouvert.
Il n'y a pas de problème de ce type lors de la réécriture avec multi-threading, tout est normal.
Voici le code pour écrire des données dans un fichier :
def Get_urls(start_page,end_page):
print ' run task {} ({})'.format(start_page,os.getpid())
url_text = codecs.open('url.txt','a','utf-8')
for i in range(start_page,end_page+1):
pageurl=baseurl1+str(i)+baseurl2+searchword
response = requests.get(pageurl, headers=header)
soup = BeautifulSoup(response.content, 'html.parser')
a_list=soup.find_all('a')
for a in a_list:
if a.text!=''and 'wssd_content.jsp?bookid'in a['href']:
text=a.text.strip()
url=baseurl+str(a['href'])
url_text.write(text+'\t'+url+'\n')
url_text.close()
Pool de processus pour plusieurs processus
def Multiple_processes_test():
t1 = time.time()
print 'parent process {} '.format(os.getpid())
page_ranges_list = [(1,3),(4,6),(7,9)]
pool = multiprocessing.Pool(processes=3)
for page_range in page_ranges_list:
pool.apply_async(func=Get_urls,args=(page_range[0],page_range[1]))
pool.close()
pool.join()
t2 = time.time()
print '时间:',t2-t1
Comme mentionné sur l'image, le fichier est chargé avec le mauvais encodage, ce qui signifie que lorsque vous écrivez dans plusieurs processus, l'encodage n'est pas utf-8
Ajoutez la première ligne du fichier :
Ouvrir le même fichier est assez dangereux et la probabilité d'erreur est assez élevée. Si
le multi-threading ne fait pas d'erreur, il s'agit très probablement de GIL,
plusieurs processus n'ont pas de verrous, il est donc facile de le faire. faire des erreurs.
Il est recommandé de passer au modèle producteur-consommateur !
Comme ça
Résultats
foo /4/wssd_content.jsp?bookid
foo /5/wssd_content.jsp?bookid
foo /6/wssd_content.jsp?bookid
foo /1/wssd_content.jsp?bookid
foo /2/wssd_content.jsp?bookid
foo /3/wssd_content.jsp?bookid
foo /7/wssd_content.jsp?bookid
foo /8/wssd_content.jsp?bookid
foo /9/wssd_content.jsp?bookid