愚公移山日记·17
今天的学习进程
今天主要学习的还是多线程,面对对象编程的类。
经历了这么长的时间,从刚开始的时候学多线程,类的一脸懵逼,到现在来说其实还是有点门路的,至少不会说像刚开始的时候一样,一看见多线程就很烦,很害怕,多多少少能看懂一些。当然我今天发现我的代码训练环节这几日真的有所减少,只顾的去学习基本的知识,而忘记去训练代码,其实现在我去玩写一些多线程的简单代码是完全可以的,包括类的多态,继承也是可以写写一些简单的例子,但是我想着去吧那道困在心里面的那个的题目解决,其实还是欠一点火候,没有办法去熟练的解决问题。
那今天我也不分享什么知识点了,就敲一遍代码吧(其实是今天的收获个人感觉有点少,花费了好长的时间去找资源学习进阶的多线程,最后也没有找到合适的资源,不的不说我今天在一很la ji的B站up主的视频里面浪费了好多时间)
import re
import random
import time
from queue import Queue
import threading
import requests
class Pro(threading.Thread):
def __init__(self,name,queue,ip_queue):
threading.Thread.__init__(self,name=name)
self.url_data = queue
self.ip_queue = ip_queue
def run(self):
while not self.url_data.empty():
url = self.url_data.get()
try:
response = requests.get(url,headers=headers,timeout=10)
response.raise_for_status()
ip_list = re.findall(r'<tr>[\s\S]*?<td>(.*?)</td>',response.text)
for ip in ip_list:
self.ip_queue.put(ip)
print(' 生产者%s将ip %s加入队列\n' % (self.getName(), ip))
except :
print('连接超时\n')
class Con(threading.Thread):
def __init__(self,name,ip_queue):
threading.Thread.__init__(self,name=name)
self.data = ip_queue
def run(self):
global flag
while flag:
val = self.data.get()
print(' 消费者%s将ip %s取出队列\n' % (self.getName(), val))
lock.acquire()
with open(path,'a') as f:
f.write(val+'\n')
lock.release()
if self.data.empty():
flag = False
time.sleep(random.random())
if __name__ == '__main__':
t1 = time.time()
print('{:-^40}'.format('主线程开始'))
path = r'E:ip.txt '
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'}
lock = threading.Lock()
queue = Queue(4)
url_list = ['http://www.xiladaili.com/gaoni/%d'%i for i in range(1,5)]
for i in url_list:
queue.put(i)
print(queue.qsize())
ip_queue = Queue(10)
flag = True
plist = []
clist = []
for i in range(4):
p = Pro('producer%d'%i, queue, ip_queue)
plist.append(p)
p.start()
time.sleep(10)
for i in range(3):
c = Con('consumer%d'%i,ip_queue)
clist.append(c)
c.start()
for t in plist:
t.join()
for t in clist:
t.join()
print('{:-^40}'.format('主线程结束'))
t2 = time.time()
t0 = t2-t1
print('耗时 : %.2f'%t0)
这是今天敲的一段代码,同时也把昨天的代码补全了,经过今天的学习,其实还是发现这段代码中的不足之处,比如在用__init__ 时,self.ip_data =ip_queue ,这并不符合大家的习惯,在爬取网站的时候其实还有好多小问题,代码健壮性不够。