当前位置: 首页 > news >正文

为什么要做网站首页设计纯静态网站模板

为什么要做网站首页设计,纯静态网站模板,五莲网站建设维护推广,wordpress删除重装目录 一、多任务概念二、实现多任务方式1、多进程 #xff08;Multiprocessing#xff09;2、多线程#xff08;Multithreading#xff09;3、协程#xff08;Coroutine#xff09; 三、多线程执行顺序四、多线程的方法1、join()2、setDaemon()3、threading.enumerate() … 目录 一、多任务概念二、实现多任务方式1、多进程 Multiprocessing2、多线程Multithreading3、协程Coroutine 三、多线程执行顺序四、多线程的方法1、join()2、setDaemon()3、threading.enumerate() 五、继承 Thread 类创建线程六、线程间的通信多线程共享全局变量七、互斥锁和死锁1、互斥锁2、死锁 八、生产者与消费者模式1、Queue 线程队列2、生产者和消费者 九、案例1、单线程实现2、多线程实现 十、作业 一、多任务概念 多任务Multitasking是指在同一时间内执行多个任务或进程的能力。它可以以不同的方式实现包括多进程、多线程和协程等。 二、实现多任务方式 1、多进程 Multiprocessing 多进程是指同时运行多个独立的进程每个进程有自己的地址空间和系统资源。多进程可以在多个处理器核心上并行执行任务每个进程拥有独立的执行环境相互之间不受影响。 进程Process 进程是计算机中运行的程序的实例。每个进程都拥有独立的内存空间和系统资源。一个进程可以包含多个线程。 2、多线程Multithreading 多线程是指在一个进程中同时执行多个线程的编程模型。线程是进程内的执行单元每个线程独立执行特定的任务但共享同一进程的内存空间。多线程编程可以提高程序的并发性和响应性。 线程Thread 线程是操作系统能够进行调度的最小单位。它包含了执行代码所需的上下文信息如程序计数器、栈、寄存器等可以独立运行和调度。多个线程可以在同一时间内执行不同的任务。 主线程Main Thread 主线程是程序启动时默认创建的第一个线程。主线程负责执行程序的入口点并可以创建其它线程。 3、协程Coroutine 协程是一种轻量级的并发编程技术它可以在单线程中实现多个独立的执行流程从而提供高效的并发和协作。与线程相比协程的切换开销更小且没有多线程中的锁和同步机制的复杂性。协程拥有自己的寄存器上下文和栈。协程调度切换时将寄存器上下文和栈保存到其它地方在切回来的时候恢复先前保存的寄存器上下文和栈。 寄存器上下文Register Context 是指存储在处理器寄存器中的一组值用于保存正在执行的程序的状态信息。寄存器上下文包含了程序计数器、栈指针、通用寄存器等寄存器的值。 并发Concurrency 并发是指多个任务同时进行但不一定同时完成。在多线程编程中线程可以并发执行通过时间片轮转等方式实现看似同时执行的效果。资源够用比如三个线程四核的 CPU。 并行Parallelism 并行是指多个任务同时进行且同时完成。在多核处理器上多个线程可以被映射到不同的核上并行执行。比如单核 CPU 资源同时只能运行一个任务A 运行一段后让给 BB 用完继续给 A交替使用提高效率。 三、多线程执行顺序 # 时间模块 import timedef task():print(hello python)time.sleep(1)print(hello world) for i in range(5):task()# hello python # hello world # hello python # hello world # hello python # hello world # hello python # hello world # hello python # hello world# 时间模块 import time # 多线程模块 import threading# 子线程 def task():print(hello python)time.sleep(1)print(hello world)# 主线程 if __name__ __main__:for i in range(5): # 循环5次创建了5个线程对象# 创建线程对象target 是执行任务t threading.Thread(targettask)# 多线程为开始工作状态t.start()# hello python # hello python # hello python # hello python # hello python # hello world # hello world # hello world # hello world # hello world四、多线程的方法 1、join() 等待子线程结束之后主线程继续执行。 谨慎使用假设子线程当中有一个死循环子线程不结束主线程能不能结束。 # 时间模块 import time # 多线程模块 import threading# 子线程 def task():print(hello python)time.sleep(1)print(hello world)# 主线程 if __name__ __main__:for i in range(5): # 循环5次创建了5个线程对象# 创建线程对象target 是执行任务t threading.Thread(targettask)# 多线程为开始工作状态t.start()# 子线程结束了才会执行后面的代码t.join()# hello python # hello world # hello python # hello world # hello python # hello world # hello python # hello world # hello python # hello world2、setDaemon() 守护线程不会等待子线程结束。 # 时间模块 import time # 多线程模块 import threading# 子线程 def task():print(hello python)time.sleep(1)print(hello world)# 主线程 if __name__ __main__:for i in range(5): # 循环5次创建了5个线程对象# 创建线程对象target 是执行任务t threading.Thread(targettask)# 守护线程主线程结束程序就立马结束了不会影响到主线程的运行t.setDaemon(True)# 多线程为开始工作状态t.start()# hello python # hello python # hello python # hello python # hello python3、threading.enumerate() 查看当前线程的数量。 # 时间模块 import time # 多线程模块 import threading# 子线程 def sing():for i in range(3):print(f正在唱歌。。。{i})time.sleep(0.5)# 子线程 def dance():for i in range(3):print(f正在跳舞。。。{i})time.sleep(0.5)# 主线程 if __name__ __main__:# 创建线程对象t1 threading.Thread(targetsing)t2 threading.Thread(targetdance)# 开启线程t1.start() # start 开启时子线程才算创建t2.start()# 查看线程数量# 2子1主共3个线程print(threading.enumerate()) # [_MainThread(MainThread, started 8584), Thread(Thread-1, started 5504), Thread(Thread-2, started 18404)]五、继承 Thread 类创建线程 # 时间模块 import time # 多线程模块 import threading# 创建的是类继承线程类就具备线程的特性 class MyThread1(threading.Thread):# 重写父类的 run 方法start 触发 run 方法def run(self):for i in range(5):print(fMyThread1---{i})time.sleep(1)class MyThread2(threading.Thread):def run(self):for i in range(5):print(fMyThread2---{i})time.sleep(1)if __name__ __main__:# 创建对象mt MyThread1()mt1 MyThread2()# 开启线程mt.start()mt1.start()六、线程间的通信多线程共享全局变量 在一个函数中对全局变量进行修改的时候如果修改了指向必须使用 global仅仅是修改了指向空间中的数据时不用必须使用 global。 线程是共享全局变量的。 import threading # 导入线程模块# 定义全局变量 num初始值为0 num 0# 定义函数 task def task():# 在函数内部使用全局变量 numglobal num# 循环数据for i in range(10000000): # 1千万num 1# 打印当前 num 的值print(task--num%d % num)# 定义函数 task1 def task1():# 在函数内部使用全局变量 numglobal num# 循环数据for i in range(10000000): # 1千万num 1# 打印当前 num 的值print(ftask1 num{num})# 主程序 if __name__ __main__:# 创建一个线程对象 t执行函数 taskt threading.Thread(targettask)# 创建一个线程对象 t1执行函数 task1t1 threading.Thread(targettask1)# 启动线程 tt.start()# 启动线程 t1t1.start()# 打印当前 num 的值在两个子线程运行之前打印print(fmain--num{num})七、互斥锁和死锁 1、互斥锁 当多个线程几乎同时修改某一个共享数据的时候需要进行同步控制。 某个线程要更改共享数据时先将其锁定此时资源的状态为“锁定”其它线程不能改变直到该线程释放资源将资源的状态变成“非锁定”其它的线程才能再次锁定该资源。 互斥锁保证了每次只有一个线程进入写入操作从而保证了多线程情况下数据的正确性。 # 创建锁 mutex threading.Lock() # 锁定 mutex.acquire() # 释放 mutex.release()import threading # 导入线程模块 import time # 导入时间模块# 定义全局变量 num初始值为0 num 0# 定义函数 task def task(nums):# 在函数内部使用全局变量 numglobal num# 获取互斥锁确保线程安全mutex.acquire()# 循环数据for i in range(nums):num 1# 释放互斥锁mutex.release()# 打印当前 num 的值print(task--num%d % num)# 定义函数 task1 def task1(nums):# 在函数内部使用全局变量 numglobal num# 获取互斥锁确保线程安全mutex.acquire()# 循环数据for i in range(nums):num 1# 释放互斥锁mutex.release()# 打印当前 num 的值print(ftask1 num{num})# 主程序 if __name__ __main__:# 创建互斥锁对象mutex threading.Lock()# 定义 nums 的值nums 10000# 创建一个线程对象 t执行函数 taskt threading.Thread(targettask, args(nums,), ) # 传参数据类型必须是元组# 创建一个线程对象 t1执行函数 task1t1 threading.Thread(targettask1, args(nums, ))# 启动线程 tt.start()# 启动线程 t1t1.start()# 主线程等待2秒确保子线程执行完毕time.sleep(2)# 打印当前 num 的值print(fmain--num{num})2、死锁 在线程间共享多个资源的时候如果两个线程分别占有一部分资源并且同时等待对方的资源就会造成死锁。 八、生产者与消费者模式 1、Queue 线程队列 Queue队列是一个线程安全的数据结构常用于在多线程编程中实现线程间的通信和数据共享。 Python 中的 queue 模块中提供了同步的、线程安全的队列类包括 FIFO先进先出队列 QueueLIFO后入先出队列 LifoQueue。 这些队列都实现了锁原语可以理解为原子操作即要么不做要么都做完能够在多线程中直接使用使用队列可以实现线程间的同步。 队列方法 初始化 Queue(maxsize)创建一个先进先出的队列。empty()判断队列是否为空。full()判断队列是否满了。get()从队列中取最后一个数据。put()将一个数据放到队列中。 from queue import Queue # 导入队列模块中的 Queue 类用于使用队列数据结构# 实例化对象队列充当的是容器 # 初始化 Queue(maxsize) q Queue(5) # maxsize 为5就只能存5组数据,可以存放任何类型的数据 q.put(1) # 往队列当中添加值 q.put({key:value}) q.put([2, 3, 4]) q.put(3.5) q.put(True) # q.put(4) # 超出队列大小程序会出现阻塞 print(----, q.qsize()) # 查看队列的大小# 取值 print(q.get()) print(q.get()) print(----, q.qsize()) # 查看队列的大小取出后的值不在队列中了# 判断队列是否满了 print(q.full()) # False 3 print(q.empty()) # 判断队列是否为空如果是空返回的是 True 2、生产者和消费者 生产者和消费者模式是多线程开发中常见的一种模式。通过这种模式可以让代码达到高内聚低耦合的目标线程管理更加方便程序分工更加明确。 生产者的线程专门用来生产一些数据然后存放到容器中间变量中消费者再从这个中间的容器中取出数据进行消费。 from queue import Queue # 导入 Queue 模块用于使用队列数据结构 import threading # 导入 threading 模块用于多线程编程 import time # 导入 time 模块用于时间相关操作# 定义函数用于向队列中存值 def set_value(q):num 0while True:# 将值放入队列q.put(num)# 值自增num 1# 线程休眠0.5秒time.sleep(0.5)# 定义函数用于从队列中获取值并打印 def get_value(q):while True:# 从队列中获取值并打印print(q.get())# 主程序 if __name__ __main__:# 创建一个大小为4的队列对象q Queue(4)# 创建一个子线程调用 set_value 函数用于存值t1 threading.Thread(targetset_value, args(q,))# 创建一个子线程调用 get_value 函数用于取值t2 threading.Thread(targetget_value, args(q,))# 启动线程 t1t1.start()# 启动线程 t2t2.start()九、案例 目标网站https://qq.yh31.com/zjbq/List_48.html 需求爬取表情包图片并且将图片保存到文件夹中 1、单线程实现 页面分析 1、数据有多页先获取第一页数据 2、确定 url判断是静态加载还是动态加载 静态加载 urlhttps://qq.yh31.com/zjbq/List_48.html 3、解析数据 先获取到所有的 img 标签 循环遍历获取每一组的数据 4、获取翻页数据观察 url 变化的规律 第一页https://qq.yh31.com/zjbq/List_48.html 第二页https://qq.yh31.com/zjbq/List_47.html 第三页https://qq.yh31.com/zjbq/List_46.html 代码实现 import requests # 导入 requests 模块用于发送网络请求 from lxml import etree # 导入 lxml 库中的 etree 模块用于解析 HTML import re # 导入 re 模块用于正则表达式匹配# 定义函数用于下载图片 def download_img():# 请求头head {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36}# 获取5页数据for i in range(48, 43, -1):# 目标 urlurl fhttps://qq.yh31.com/zjbq/List_{i}.html# 发送 get 请求获取响应对象res requests.get(url, headershead)# 设置响应编码为 utf-8res.encoding utf-8# 打印响应内容# print(res.text)# 解析响应内容html etree.HTML(res.text)# 获取所有的 img 标签images html.xpath(//div[classzj_tp]/a/img)# 遍历循环每一个 img 标签for img in images:# 获取图片 urlimg_url img.xpath(src)[0]# 获取图片标题img_title img.xpath(alt)[0]# 使用正则表达式替换标题中的特殊字符title re.sub(r[:.()/\\], , img_title)# 打印图片 url 和标题# print(img_url, img_title)# 发送 get 请求获取图片响应res requests.get(img_url, headershead)# 打开文件将图片内容写入到文件中with open(fpictures/{title}.jpg, wb) as f:f.write(res.content)print(f{title}正在下载)# 调用下载图片的函数 download_img()2、多线程实现 页面分析 用生产者与消费者下载表情包 一个是生产数据类一个是下载数据类 队列只是一个容器 代码实现 import requests # 导入 requests 库用于发送 HTTP 请求 from lxml import etree # 导入 lxml 库用于解析 HTML import re # 导入 re 库用于正则表达式操作 import threading # 导入 threading 库用于多线程编程 from queue import Queue # 导入 Queue 类用于创建队列# 请求头 head {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 }# 生产者类用于获取图片链接 class Producer(threading.Thread):# 初始化方法def __init__(self, page_queue, img_queue):# 必须要执行父类当中的 init 方法完成初始化super().__init__()# 设置页码队列属性self.page_queue page_queue# 设置图片队列属性self.img_queue img_queue# 重写 run 方法def run(self):# 循环取队列里面的数据直到队列数据为空while True:# 如果页码队列为空if self.page_queue.empty():# 退出循环break# 从页码队列中获取 urlurl self.page_queue.get()# 打印 url# print(url)# 调用 parse_html 方法解析页面self.parse_html(url)# 定义解析页面的方法def parse_html(self, url):# 发送 get 请求获取响应对象res requests.get(url, headershead)# 设置响应编码为 utf-8res.encoding utf-8# 打印响应内容# print(res.text)# 解析响应内容html etree.HTML(res.text)# 获取所有的 img 标签images html.xpath(//div[classzj_tp]/a/img)# 遍历循环每一个 img 标签for img in images:# 获取图片 urlimg_url img.xpath(src)[0]# 获取图片标题img_title img.xpath(alt)[0]# 使用正则表达式替换标题中的特殊字符title re.sub(r[:.()/\\], , img_title)# 将图片 url 和标题作为元组放入图片队列中self.img_queue.put((img_url, title))# 打印图片队列的大小# print(self.img_queue.qsize())# 消费者类用于下载图片 class consumer(threading.Thread):# 初始化方法def __init__(self, img_queue):# 必须要执行父类当中的 init 方法完成初始化super().__init__()# 设置图片队列属性self.img_queue img_queue# 重写 run 方法def run(self):# 循环取队列里面的数据直到队列数据为空while True:# 打印图片队列的大小print(self.img_queue.qsize())# # 如果图片队列为空# if self.img_queue.empty():# # 退出循环# break# 从图片队列中获取图片数据img_data self.img_queue.get()# 将图片数据解包为 url 和标题url, title img_data# 发送 get 请求获取图片响应res requests.get(url, headershead)# 打开文件将图片内容写入到文件中with open(fpictures/{title}.jpg, wb) as f:f.write(res.content)print(f{title}正在下载)# 主程序 if __name__ __main__:# 存放 url 的队列page_queue Queue()# 创建图片队列img_queue Queue()# 循环页码for i in range(48, 43, -1):# 创建 urlurl fhttps://qq.yh31.com/zjbq/List_{i}.html# url 放入页码队列page_queue.put(url)# 创建空列表lst []# 创建生产者for i in range(3):# 将存放的 url 队列传递给生产者t Producer(page_queue, img_queue)# 开启线程t.start()# 添加线程到列表lst.append(t)# # join等子线程结束了才会执行主线程的代码# # 加 join 是生产完了再下载不加是边生产边下载# # 如消费者 run 方法里判断图片队列为空就需要加 join# for i in lst:# i.join()# 创建消费者for i in range(3):# 将图片队列传递给消费者t1 consumer(img_queue)# 开启线程t1.start()十、作业 目标网站https://www.fabiaoqing.com/biaoqing/lists/page/1.html 需求爬取表情包图片并且将图片保存到文件夹中 import requests # 导入 requests 库用于发送 HTTP 请求 from lxml import etree # 导入 lxml 库用于解析 HTML import re # 导入 re 库用于正则表达式操作 import threading # 导入 threading 库用于多线程编程 from queue import Queue # 导入 Queue 类用于创建队列# 请求头 head {Referer:https://www.fabiaoqing.com/,User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 }# 生产者类用于获取图片链接 class Producer(threading.Thread):# 初始化方法def __init__(self, page_queue, img_queue):# 必须要执行父类当中的 init 方法完成初始化super().__init__()# 设置页码队列属性self.page_queue page_queue# 设置图片队列属性self.img_queue img_queue# 重写 run 方法def run(self):# 循环取队列里面的数据直到队列数据为空while True:# 如果页码队列为空if self.page_queue.empty():# 退出循环break# 从页码队列中获取 urlurl self.page_queue.get()# 打印 url# print(url)# 调用 parse_html 方法解析页面self.parse_html(url)# 定义解析页面的方法def parse_html(self, url):# 发送 get 请求获取响应对象res requests.get(url, headershead)# 设置响应编码为 utf-8res.encoding utf-8# 打印响应内容# print(res.text)# 解析响应内容html etree.HTML(res.text)# 获取所有的 img 标签images html.xpath(//div[classtagbqppdiv]/a/img)# 遍历循环每一个 img 标签for img in images:# 获取图片 urlimg_url img.xpath(data-original)[0]# 获取图片标题img_title img.xpath(alt)[0]# 使用正则表达式替换标题中的特殊字符title re.sub(r[:.()/\\], , img_title)# 将图片 url 和标题作为元组放入图片队列中self.img_queue.put((img_url, title))# 打印图片队列的大小# print(self.img_queue.qsize())# 消费者类用于下载图片 class consumer(threading.Thread):# 初始化方法def __init__(self, img_queue):# 必须要执行父类当中的 init 方法完成初始化super().__init__()# 设置图片队列属性self.img_queue img_queue# 重写 run 方法def run(self):# 循环取队列里面的数据直到队列数据为空while True:# 打印图片队列的大小print(self.img_queue.qsize())# # 如果图片队列为空# if self.img_queue.empty():# # 退出循环# break# 从图片队列中获取图片数据img_data self.img_queue.get()# 将图片数据解包为 url 和标题url, title img_data# 发送 get 请求获取图片响应res requests.get(url, headershead)# 打开文件将图片内容写入到文件中with open(fpictures/{title}.jpg, wb) as f:f.write(res.content)print(f{title}正在下载)# 主程序 if __name__ __main__:# 存放 url 的队列page_queue Queue()# 创建图片队列img_queue Queue()# 循环页码for i in range(1, 5, 1):# 创建 urlurl fhttps://www.fabiaoqing.com/biaoqing/lists/page/{i}.html# url 放入页码队列page_queue.put(url)# 创建空列表lst []# 创建生产者for i in range(3):# 将存放的 url 队列传递给生产者t Producer(page_queue, img_queue)# 开启线程t.start()# 添加线程到列表lst.append(t)# # join等子线程结束了才会执行主线程的代码# # 加 join 是生产完了再下载不加是边生产边下载# # 如消费者 run 方法里判断图片队列为空就需要加 join# for i in lst:# i.join()# 创建消费者for i in range(3):# 将图片队列传递给消费者t1 consumer(img_queue)# 开启线程t1.start()记录学习过程欢迎讨论交流尊重原创转载请注明出处~
http://www.zqtcl.cn/news/606028/

相关文章:

  • 支持api网站开发大疆网站建设
  • 国家排污许可网站台账怎么做进销存永久免费
  • 做游戏脚本的网站精品国内网站建设
  • 好的网站建站公司门户网站栏目维护建设方案
  • 如何在电脑上建立网站企业百度网站怎么做的
  • 34线城市做网站推广网站页面如何设计图
  • 成都网站建设前十广州开发网站设计
  • qq人脸解冻自助网站加工平台推荐
  • 中国室内设计联盟网官网网站专题页优化
  • 设计模板图热狗网站关键词优化
  • 无锡网站开发公司重庆网站有哪些
  • 做网站找什么公司工作网站开发思维导图内容
  • 有人知道做网站吗?wordpress多站点cdn
  • 网站风格特点大型外包公司有哪些
  • 如何网站seo用asp做网站有哪控件
  • 网站建设需要哪些成本wordpress商城建站教程
  • 做网络的网站很重要吗网站认证费用
  • flash网站项目背景网页截图快捷键可拉动
  • 郑州企业建设网站北京企业网站模板建站开发
  • 宣传旅游网站建设的观点是什么公众号怎么推广和引流
  • 企业网站制作多少钱山西网络营销方案
  • 焦作住房和城乡建设局网站旅行网站模板
  • 男做基视频网站国家重点高新技术企业名单
  • 公司官方网站开发网站建设电子商务
  • seo网站优化系统搜索引擎优化排名案例
  • 郑州网站建设工作室网站建设全流程 知乎
  • 如何利用源码做网站外贸网站制作推广
  • 国内做网站哪家公司好免费查找资料的网站
  • 自己做的网站百度搜不到搭建网站seo
  • 奇墙网站建设高端网站建设公司联系电话