threading库
threading库是python3内置的线程库,可以使用threading库创建多个线程
创建多线程的两种方法
- 继承Thread类(推荐使用)
直接看代码,注意看注释讲解
import re, requests, threading
class MyThread(threading.Thread):
"""
定义一个线程
用于获取一个页面的文章内容
"""
def __init__(self, per_link):
# 这里需要调用父类的构造函数
# 因为Thread类在定义线程的时候就是通过构造函数使用的run函数(个人猜测...)
super().__init__()
self.link = per_link
self.content = '' # 空字符串
self.contents = []
def run(self):
# 修改run函数的内容
# 改为要执行的线程的程序代码
res = requests.get(self.link)
res.encoding = 'gbk'
self.contents = re.findall('<p>(.*?)</p>', res.text, re.S)
# print(self.contents[0])
self.content = self.contents[0].replace('<br />', '')
# 通过类继承的方法定义多线程时有个有点就是可以添加函数用作其他功能
# 例如,添加一个函数用于返回线程的执行结果返回值
def get_result(self):
print(self.content)
return self.content
class MultiCrawler():
"""
接收页面链接列表,并依次访问、调用线程
"""
def __init__(self, links):
self.link_list = links
self.content_list = []
def multi_crawer(self):
for i in self.link_list:
# 实例化一个线程
t = MyThread(i)
#启动线程
t.start()
# 等待这个线程结束
t.join()
self.content_list.append(t.get_result())
return self.content_list
为什么使用类继承的方法时一定要调用父类的__init__()
- 实例化Thread类
这个方法简单讲一下,因为个人觉得使用起来不够灵活
def thread1():
print('thread 1 is running...')
def thread2():
print('thread 2 is running...')
t1 = threading.Thread(target=thread1, args=())
t1.start()
t1.join()
t2 = threading.Thread(target=thread2, args=())
t2.start()
t2.join()