Heim  >  Artikel  >  Backend-Entwicklung  >  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
WBOYOriginal
2016-12-05 13:27:201537Durchsuche

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

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))

 # 一般方式
 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)

# 多线程
 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)

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)




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

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

Stellungnahme:
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