愚公移山日记·17

愚公移山日记·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 ,这并不符合大家的习惯,在爬取网站的时候其实还有好多小问题,代码健壮性不够。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值