多线程——threading和queue模块的理解。加实例+详解+思路

news2025/1/9 17:11:00

并发:假的多任务

并行:真的多任务

实现多线程用——threading模块

import threading
import time

def shuru():
    for i in range(1,4):
        print("正在输入")
        time.sleep(1)
def shuchu():
    for i in range(1,4):
        print("正在输出")
        time.sleep(1)

t = threading.Thread(target=shuru)
t2 = threading.Thread(target=shuchu)
t.start()
t2.start()

在遇到start时,才会运行。 (创建一个Thread不会创建一个线程)

start调用后才会创建

 

这个就是个简单的多线程,但是如果我们用,输入代表,输入网站url,输出为下载到文件。

这就是混乱的,就会不好满足。 

2.查看线程数量。

threading.enumerate()

3.传参

t2 = threading.Thread(target=shuchu,args=(10,))

args传入的是一个“元组

                                                            <指名道姓的传参>

t2 = threading.Thread(target=shuchu,kwargs={'num1':44,'num':10})

注意形式

=========================================================================

创建线程的另一种方式:(如果想要线程,线程之间共享数据,用上面的方法就会不好)

用类的方式去实现。

import threading
import time


class Task(threading.Thread):
    def run(self):
        while True:
            print("qqqq")
            time.sleep(1)
t = Task()
t.start()
print(len(threading.enumerate()))
while True:
    print("ppp")
    time.sleep(1)

可以看出有两个线程。

一但start()就会到run方法里面去——这里只会去执行run里面。想要用别的方法,就在run里面       去调用


队列(Queue)——为什么要用——就是要配合,就像,先生产,再消费。也就是说,就像提取网络图片,是先拿到网址,然后请求,然后保存的。是有先后顺序的。

可以让多个线程之间实现数据共享,可以实现先,存入,然后先出去。

1.先进先出-queue.Queue()

这里的put和get,会等待。直到有数据。没有数据时就会一直等待

import queue

list_m = queue.Queue()
list_m.put('123')
print(list_m.get())

 

存入然后打印

import queue

list_m = queue.Queue()
list_m.put('123')
list_m.put('456')
list_m.put('789')

print(list_m.get())
print(list_m.get())
print(list_m.get())

先进先出。 

2.先进后出——queue.LifoQueue()

import queue
list_m = queue.LifoQueue()
list_m.put('123')
list_m.put('456')
list_m.put('789')

print(list_m.get())
print(list_m.get())
print(list_m.get())

3.优先级—— queue.PriorityQueue()

数字越小优先级越高 

import queue
list_m = queue.PriorityQueue()
list_m.put((1,'123'))
list_m.put((7,'456'))
list_m.put((2,'789'))

print(list_m.get())
print(list_m.get())
print(list_m.get())


下来进入正题:关于多线程网站的爬取 ——BeautifulSoup+threading

 简单说一下下面代码的思路:

1.先建立,两个queue.Queue队列,用来存放url(这个是页数) 和html(这个是书名的网址) 

2.让把目录的网站都放在url队列里

3.然后再建立三个线程去,获得html,直到 url_queue.get()获取完成,机会阻塞。这个线程就停了

4.然后建立两个去保存标题

import queue
import time
import random
import threading
import requests
from bs4 import BeautifulSoup

urls = [
    f"https://www.cnblogs.com/#p{page}"
    for page in range(1,50+1)
]
def craw(url):
    r= requests.get(url)
    return r.text


def parse(html):
#class="post-item-title"
    soup = BeautifulSoup(html,'html.parser')
    links = soup.find_all('a',class_='post-item-title')
    return [(link["href"],link.get_text())for link in links]
def do_craw(url_queue:queue.Queue,html_queue:queue.Queue):
    while True:
        url = url_queue.get()
        html = craw(url)
        html_queue.put(html)
        time.sleep(random.randint(1,2))#随机的睡眠一到两秒
def do_parse(html_queue:queue.Queue,fout):
    while True:
        html = html_queue.get()
        results = parse(html)
        for result in results:
            fout.write(str(result)+"\n")
        time.sleep(random.randint(1,2))#随机的睡眠一到两秒

if __name__=="__main__":
    url_queue=queue.Queue()
    html_queue = queue.Queue()
    for url in urls:
        url_queue.put(url)
    #生产者线程
    for idx in range(3):
        t=threading.Thread(target=do_craw,args=(url_queue,html_queue))
        t.start()
    #消费者线程
    fout = open("03.data.txt","w")
    for idx in range(2):
        t=threading.Thread(target=do_parse,args=(html_queue,fout))
        t.start()

主要用到几个函数:

其中两个要去线程的函数:

1.def do_parse(html_queue:queue.Queue,fout):
2.def do_craw(url_queue:queue.Queue,html_queue:queue.Queue):

将你的线程对象给,这个函数。也就是实现了,线程之间的数据的共享

你给的其实就是列表,然后你给进去然后,一个一个get。直到get结束

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1461375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初阶数据结构之---顺序表和链表(C语言)

引言-线性表 线性表&#xff1a; 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构。线性表在逻辑上是线性结构&#xff0c;也就是说是连续的一条直线。但在物理上并不一定是连续的。线性表在物理上…

基于EasyCVR视频汇聚系统的公安网视频联网共享视频云平台建设思路分析(一)

随着社会的发展和科技的进步&#xff0c;视频监控系统在各个领域的应用越来越广泛&#xff0c;视频云平台建设已经成为了行业数字化转型的重要一环。公安网视频汇聚联网共享云的建设需要充分考虑技术、架构、安全、存储、计算等多方面因素&#xff0c;以确保平台的稳定性和可用…

深度学习图像处理基础

这里写目录标题 分辨率是什么 视网膜屏视网膜屏人眼的视觉视力 像素密度设置合适的PPI&#xff0c;制造视网膜屏 色彩是什么色匹配实验色彩匹配的意义量化色彩匹配白色合为1色度图 总结 HDR光亮度&#xff08;尼特&#xff09;灰阶亮度范围HDR显示技术总结 数字图像化概览 人脸…

Excel SUMPRODUCT函数用法(乘积求和,分组排序)

SUMPRODUCT函数是Excel中功能比较强大的一个函数&#xff0c;可以实现sum,count等函数的功能&#xff0c;也可以实现一些基础函数无法直接实现的功能&#xff0c;常用来进行分类汇总&#xff0c;分组排序等 SUMPRODUCT 函数基础 SUMPRODUCT函数先计算多个数组的元素之间的乘积…

German Prepositions

German Prepositions 一, ab and auerhalb1, ab2,auerhalb 二, an三&#xff0c;auf 一, ab and auerhalb 1, ab 2,auerhalb 二, an 静三 动四 时间&#xff08;节日省略dem&#xff09; 表近似 三&#xff0c;auf 静三 动四 meas wann 加一段时间 表方式 固定搭…

若依前后端分离版如何集成的mybatis以及修改集成mybatisplus实现Mybatis增强

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_本地运行若依前后端分离-CSDN博客 SpringBoot中使用PageHelper插件实现Mybatis分页&#xff1a; SpringBoot中使用PageHelper插件实现Mybatis分页-C…

本地创建Git仓库

在 Windows 下&#xff0c;可以通过以下步骤在本地创建一个 并模拟远程Git 仓库。 1、在命令行中打开模拟远程Git 仓库目标文件夹&#xff1a; 打开命令提示符或 PowerShell。例如&#xff1a; 创建裸仓库&#xff08;模拟远程仓库&#xff09;&#xff1a;创建一个裸仓库&am…

【Flutter】底部导航BottomNavigationBar的使用

常用基本属性 属性名含义是否必须items底部导航栏的子项List是currentIndex当前显示索引否onTap底部导航栏的点击事件&#xff0c; Function(int)否type底部导航栏类型&#xff0c;定义 [BottomNavigationBar] 的布局和行为否selectedItemColor选中项图标和label的颜色否unsel…

Java学习小记——设计模式

设计模式 设计模式简介Singleton模式Singleton模式简介Singleton的创建双重锁模式Double checked locking作为Java类的静态变量 变继承关系为组合关系组合模式装饰器模式 如何创建对象抽象工厂模式 设计模式简介 设计模式&#xff08;Design pattern&#xff09;代表了最佳的实…

2024 年了,如何 0 基础开始学习 Vue ?

最近 5 个月&#xff0c;我都在忙着构建我的第一开源项目 HexoPress&#xff0c;这个项目是使用 Electron Vue 3 TypeScript 等技术实现的&#xff0c;一方面&#xff0c;我真的很需要一款合自己心意的博客编辑器&#xff0c;另一方面&#xff0c;我也是真心想学习 Electron …

QT应用软件【协议篇】周立功CAN接口卡代码示例

文章目录 USBCAN系列CAN接口卡规格参数资料下载QT引用周立功的库安装sdk代码USBCAN系列CAN接口卡 USBCAN系列CAN接口卡兼容USB2.0全速规范,可支持1/2/4/8路CAN接口。采用该接口卡,PC机可通过USB连入CAN网络,进行CAN总线数据采集和处理,主要具备以下几大优势特点: 支持车载…

【HarmonyOS应用开发】三方库(二十)

三方库的基本使用 一、如何获取三方库 目前提供了两种途径获取开源三方库&#xff1a; 通过访问Gitee网站开源社区获取 在Gitee中&#xff0c;搜索OpenHarmony-TPC仓库&#xff0c;在tpc_resource中对三方库进行了资源汇总&#xff0c;可以供开发者参考。 通过OpenHarmony三…

Day 30 标准IO

文章目录 1.什么是标准IO1.1 概念1.2 特点1.3 操作 2.缓存区3.函数接口3.1 打开文件fopen3.2 关闭文件 fclose3.3 读写文件操作3.3.1 每次读写一个字符&#xff1a;fgetc()、fputc()每次读一个字符fgetc()每次写一个字符fputc()(1)针对文件(2)针对终端feof和ferror 3.3.2 每次一…

Java+SpringBoot+Vue的大学生就业信息管理系统

一、项目介绍 基于Java (spring-boot)的大学生就业信息管理系统分为三个角色&#xff1a;管理员、企业、求职者。 功能:登录、注册功能、学生信息管理、企业信息管理、岗位分类管理、学历信息管理、应聘信息管理、求职者信息管理、招聘信息管理。 二、作品包含 三、项目技术 后…

srs集群下行edge处理逻辑

官方关于源站集群的介绍&#xff1a; Origin Cluster | SRS 下行边缘是指观众端从边缘edge拉流&#xff0c;边缘edge回源到源站origin节点拉流&#xff0c;然后再 把流转给客户端 边缘处理类SrsPlayEdge 当服务器收到播放请求时&#xff0c;创建对应的consumer消费者。在创…

2.1_1 进程的概念、组成、特征

2.1_1 进程的概念、组成、特征 &#xff08;一&#xff09;进程的概念 程序&#xff1a;是静态的&#xff0c;就是一个存放在磁盘里的可执行文件&#xff0c;就是一系列的指令集合。 进程&#xff08;Process&#xff09;&#xff1a;是动态的&#xff0c;是程序的一次执行过程…

Java学习--黑马SpringBoot3课程个人总结-2024-02-16

1.添加文章 1.1 富文本编辑器 文章内容需要使用到富文本编辑器&#xff0c;这里咱们使用一个开源的富文本编辑器 Quill 官网地址&#xff1a; https://vueup.github.io/vue-quill/ 安装&#xff1a; npm install vueup/vue-quilllatest --save导入组件和样式&#xff1a; …

基于springboot+vue的B2B平台的医疗病历交互系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【git 使用】git 中head、工作树、和索引分别是什么,有什么关系和区别

HEAD 定义&#xff1a;HEAD 是指向当前所在分支&#xff08;或者是某个特定的提交&#xff09;的指针&#xff0c;它表示当前工作目录正在处于哪个提交或分支上。作用&#xff1a;HEAD 指示了当前工作目录的状态&#xff0c;可以通过 HEAD 来确定当前处于哪个分支上&#xff0…

【已解决】PPT无法复制内容怎么办?

想要复制PPT文件里的内容&#xff0c;却发现复制不了&#xff0c;怎么办&#xff1f; 这种情况&#xff0c;一般是PPT文件被设置了以“只读方式”打开&#xff0c;“只读方式”下的PPT无法进行编辑更改&#xff0c;也无法进行复制粘贴的操作。 想要解决这个问题&#xff0c;我…