30
2017
09

使用 Python 进行线程编程 多队列数据挖掘网站


  1. 1.创建一个 Queue.Queue() 的实例,然后使用数据对它进行填充。

  2. 2.将经过填充数据的实例传递给线程类,后者是通过继承 threading.Thread 的方式创建的。

  3. 生成守护线程池。

  4. 3.每次从队列中取出一个项目,并使用该线程中的数据和 run 方法以执行相应的工作。

  5. 4.在完成这项工作之后,使用 queue.task_done() 函数向任务已经完成的队列发送一个信号。

  6. 5.对队列执行 join 操作,实际上意味着等到队列为空,再退出主程序。

import queue
import threading
import time
import requests
from bs4 import BeautifulSoup

hosrs = ['http://www.fdsafddfqwr.net','http://news.163.com','http://www.qq.com','http://www.163.com','http://www.dyroy.com','http://www.1rc1.com']

urlqueue = queue.Queue()
out_queue = queue.Queue()

class ThreadUrl(threading.Thread):
	def __init__(self,urlque,outque):
		threading.Thread.__init__(self)
		self.urlque = urlque
		self.outque = outque

	def run(self):
		while True:
			host = ''
			try:
				host = self.urlque.get()
				url = requests.get(host)
				chunk = url.text
				self.outque.put(chunk)
				self.urlque.task_done()
			except Exception as e:
				print('打不开网站:%s'%host)
				self.urlque.put('http://www.csdn.com')
				self.urlque.task_done()

class DatamineThread(threading.Thread):
	def __init__(self,outque):
		threading.Thread.__init__(self)
		self.out_queue = outque

	def run(self):
		while True:
			chunk = self.out_queue.get()
			soup = BeautifulSoup(chunk,"lxml")
			print(soup.find('title'))
			self.out_queue.task_done()


start = time.time()
def main():
	for x in range(4):
		t = ThreadUrl(urlqueue,out_queue)
		t.setDaemon(True)
		t.start()

	for host in hosrs:
		urlqueue.put(host)

	for i in range(2):
		dt = DatamineThread(out_queue)
		dt.setDaemon(True)
		dt.start()

	urlqueue.join()
	out_queue.join()

if __name__ == '__main__':
	main()
	print("Elapsed Time: %f" % (time.time() - start))


上一篇:Python3 多线程 使用 threading 模块创建线程 下一篇:Python GUI编程(Tkinter)创建一个GUI程序