Heim > Backend-Entwicklung > Python-Tutorial > Ausführliche Erklärung und Beispielcode für das Multithreading des Python-Crawlers

Ausführliche Erklärung und Beispielcode für das Multithreading des Python-Crawlers

WBOY
Freigeben: 2016-12-05 13:27:20
Original
1600 Leute haben es durchsucht

Python unterstützt Multithreading, hauptsächlich durch die beiden Module Thread und Threading. Das Thread-Modul ist ein Modul auf relativ niedriger Ebene, und das Threading-Modul umschließt Threads, um die Verwendung zu vereinfachen.

Obwohl das Multithreading von Python durch GIL eingeschränkt ist und kein echtes Multithreading ist, kann es dennoch die Effizienz für E/A-intensive Berechnungen wie Crawler erheblich verbessern.
Im Folgenden wird anhand eines Beispiels die Effizienz von Multithreading überprüft. Der Code umfasst nur die Seitenerfassung und analysiert sie nicht.

# -*-coding:utf-8 -*-
import urllib2, time
import threading

class MyThread(threading.Thread):
 def __init__(self, func, args):
  threading.Thread.__init__(self)
  self.args = args
  self.func = func

 def run(self):
  apply(self.func, self.args)

def open_url(url):
 request = urllib2.Request(url)
 html = urllib2.urlopen(request).read()
 print len(html)
 return html

Nach dem Login kopieren

if __name__ == '__main__':
 # 构造url列表
 urlList = []
 for p in range(1, 10):
  urlList.append('http://s.wanfangdata.com.cn/Paper.aspx?q=%E5%8C%BB%E5%AD%A6&p=' + str(p))

Nach dem Login kopieren

 # 一般方式
 n_start = time.time()
 for each in urlList:
  open_url(each)
 n_end = time.time()
 print 'the normal way take %s s' % (n_end-n_start)

Nach dem Login kopieren

# 多线程
 t_start = time.time()
 threadList = [MyThread(open_url, (url,)) for url in urlList]
 for t in threadList:
  t.setDaemon(True)
  t.start()
 for i in threadList:
  i.join()
 t_end = time.time()
 print 'the thread way take %s s' % (t_end-t_start)
Nach dem Login kopieren

Verwenden Sie zwei Methoden, um 10 Webseiten mit relativ langsamer Zugriffsgeschwindigkeit zu erhalten. Die allgemeine Methode dauert 50 Sekunden und Multithreading dauert 10 Sekunden.
Multithread-Codeinterpretation:

# 创建线程类,继承Thread类
class MyThread(threading.Thread):
 def __init__(self, func, args):
  threading.Thread.__init__(self) # 调用父类的构造函数
  self.args = args
  self.func = func

 def run(self): # 线程活动方法
  apply(self.func, self.args)

Nach dem Login kopieren




threadList = [MyThread(open_url, (url,)) for url in urlList] # 调用线程类创建新线程,返回线程列表
 for t in threadList:
  t.setDaemon(True) # 设置守护线程,父线程会等待子线程执行完后再退出
  t.start() # 线程开启
 for i in threadList:
  i.join() # 等待线程终止,等子线程执行完后再执行父线程

Nach dem Login kopieren

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage