300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 【python】python实现多线程并得到返回值

【python】python实现多线程并得到返回值

时间:2020-01-16 20:17:22

相关推荐

【python】python实现多线程并得到返回值

文章目录

一、带有返回值的多线程 1.1 实现代码1.2 结果 二、实现过程 2.1 一个普通的单线程爬虫函数2.2 一个简单的多线程传值实例2.3 实现重点 三、代码实战四、学习

一、带有返回值的多线程

1.1 实现代码

# -*- coding:utf-8 -*-"""作者:wyt日期:04月21日"""import threadingimport requestsimport timeurls = [f'/#p{page}' # 待爬地址for page in range(1, 10) # 爬取1-10页]def craw(url):r = requests.get(url)num = len(r.text) # 爬取博客园当页的文字数return num # 返回当页文字数def sigle(): # 单线程res = []for i in urls:res.append(craw(i))return resclass MyThread(threading.Thread): # 重写threading.Thread类,加入获取返回值的函数def __init__(self, url):threading.Thread.__init__(self)self.url = url# 初始化传入的urldef run(self):# 新加入的函数,该函数目的:self.result = craw(self.url) # ①。调craw(arg)函数,并将初试化的url以参数传递——实现爬虫功能# ②。并获取craw(arg)函数的返回值存入本类的定义的值result中def get_result(self): #新加入函数,该函数目的:返回run()函数得到的resultreturn self.resultdef multi_thread():print("start")threads = [] # 定义一个线程组for url in urls:threads.append( # 线程组中加入赋值后的MyThread类MyThread(url) # 将每一个url传到重写的MyThread类中)for thread in threads: # 每个线程组startthread.start()for thread in threads: # 每个线程组jointhread.join()list = []for thread in threads:list.append(thread.get_result()) # 每个线程返回结果(result)加入列表中print("end")return list # 返回多线程返回的结果组成的列表if __name__ == '__main__':start_time = time.time()result_multi = multi_thread()print(result_multi) # 输出返回值-列表# result_sig = sigle()# print(result_sig)end_time = time.time()print('用时:', end_time - start_time)

1.2 结果

单线程:

多线程:

加速效果明显。

二、实现过程

2.1 一个普通的单线程爬虫函数

import threadingimport requestsimport timeurls = [f'/#p{page}' # 待爬地址for page in range(1, 10) # 爬取1-10页]def craw(url):r = requests.get(url)num = len(r.text) # 爬取博客园当页的文字数print(num)def sigle(): # 单线程res = []for i in urls:res.append(craw(i))return resif __name__ == '__main__':start_time = time.time()result_sig = sigle()print(result_sig)end_time = time.time()print('用时:', end_time - start_time)

2.2 一个简单的多线程传值实例

import timefrom threading import Threaddef foo(number):time.sleep(1)return numberclass MyThread(Thread):def __init__(self, number):Thread.__init__(self)self.number = numberdef run(self):self.result = foo(self.number)def get_result(self):return self.resultif __name__ == '__main__':thd1 = MyThread(3)thd2 = MyThread(5)thd1.start()thd2.start()thd1.join()thd2.join()print(thd1.get_result())print(thd2.get_result())

返回:

35

2.3 实现重点

多线程入口

threading.Thread(target=craw,args=(url,)) # 注意args=(url,),元组

多线程传参

需要重写一下threading.Thread类,加一个接收返回值的函数。

三、代码实战

使用这种带返回值的多线程技术重写了一下之前发布过的一个爬取子域名的代码,原始代码在这里:/qq_45859826/article/details/124030119

import threadingimport requestsfrom bs4 import BeautifulSoupfrom static.plugs.headers import get_ua#/search?q=site%&go=Search&qs=ds&first=20&FORM=PEREdef search_1(url):Subdomain = []html = requests.get(url, stream=True, headers=get_ua())soup = BeautifulSoup(html.content, 'html.parser')job_bt = soup.findAll('h2')for i in job_bt:link = i.a.get('href')# print(link)if link not in Subdomain:Subdomain.append(link)return Subdomainclass MyThread(threading.Thread):def __init__(self, url):threading.Thread.__init__(self)self.url = urldef run(self):self.result = search_1(self.url)def get_result(self):return self.resultdef Bing_multi_thread(site):print("start")threads = []for i in range(1, 30):url = "/search?q=site%3A" + site + "&go=Search&qs=ds&first=" + str((int(i) - 1) * 10) + "&FORM=PERE"threads.append(MyThread(url))for thread in threads:thread.start()for thread in threads:thread.join()res_list = []for thread in threads:res_list.extend(thread.get_result())res_list = list(set(res_list)) #列表去重number = 1for i in res_list:number += 1number_list = list(range(1, number + 1))dict_res = dict(zip(number_list, res_list))print("end")return dict_resif __name__ == '__main__':print(Bing_multi_thread(""))

返回:

{1:'/index',2:'/msgrd?v=3&uin=448388692&site=qq&menu=yes',3:'https://en./',4:'/wap/com/v1/dist/unbind_login_qq.shtml?source=h5_wx',5:'/',6:'/rain/a/2029A040B600',7:'http://cp./index.html',8:'http://s./',9:'/rain/a/0321A0CF1X00',10:'/about.html',11:'/10016675',12:'http://uni./',13:'/omn/TWF0/TWF042400147500.html',14:'/?from=exur#!',15:'/answer_group.html',16:'https://view./a/0330A00HTS00',17:'/mac/en/index.html',18:'https://windows./?lang=en_US',19:'https://cc./upload',20:'https://xiaowei./skill',21:'/msgrd?v=3&uin=286771835&site=qq&menu=yes',22:'/',23:'https://uni./',24:'/',25:'/',26:'/',27:'/',28:'/?_wv=1027&k=pevCjRtJ',29:'/x/page/z0678c3ys6i.html',30:'/10018921',31:'https://m./manage/manage.html',32:'/',33:'/rain/a/1012A0A3L000',34:'/10021593',35:'https://pc./?t=win_weixin&lang=en',36:'/lottery/09fucai/cqssc.htm'}

非常非常非常能感受到速度快了超级多,用这种方式爆破子域名也比较爽。没有多线程,我的项目里可能缺少了好几个功能:因为之前写过的一些程序都因执行时间过长被我砍掉。这个功能还是很实用的。

四、学习

B站python-多线程教程:/video/BV1bK411A7tV

4月28日于家中,加油!

先自我介绍一下,小编上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。