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

并发:假的多任务

并行:真的多任务

实现多线程用——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结束

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通俗易懂的双亲委派机制

当你超过别人一点点&#xff0c;别人会嫉妒你&#xff1b;当你超过别人一大截&#xff0c;别人就会羡慕你 据说给我点关注的都成了大佬&#xff0c;点关注的我都会私发一份好东西 ​​​​你得先知道 在介绍双亲委派机制的时候&#xff0c;不得不提ClassLoader&#xff08;类…

Windows / Linux dir 命令

Windows / Linux dir 命令 1. dir2. dir *.* > data.txt3. dir - list directory contentsReferences 1. dir 显示目录的文件和子目录的列表。 Microsoft Windows [版本 10.0.18363.900] (c) 2019 Microsoft Corporation。保留所有权利。C:\Users\cheng>dir驱动器 C 中…

xxl-job架构原理讲解

1、调度中心 调度中心是一个单独的Web服务&#xff0c;主要是用来触发定时任务的执行 它提供了一些页面操作&#xff0c;我们可以很方便地去管理这些定时任务的触发逻辑 调度中心依赖数据库&#xff0c;所以数据都是存在数据库中的 调度中心也支持集群模式&#xff0c;但是…

mybatis数据操作语句

//基于注解 Mapper public interface reboudapt {Select("select * from dept")List<dept> huoqudept();//删除语句Delete("delete from dept where id #{id}")void deletesc(Integer id);//增加语句Insert("insert into dept(name, create_t…

【flutter】第一个flutter项目

前言 我们通过Android Studio来创建flutter项目。 安装dart和flutter插件 新版编译器需要先安装flutter插件才能构建flutter项目。 项目目录 我们基本就在lib中写代码 项目启动

PiflowX-组件UnionAll

UnionAll组件 组件说明 Union多个输入源。输入源必须具有相同的字段类型。 计算引擎 flink 组件分组 common 端口 Inport&#xff1a;Any outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子inportsInports“”无否Inports string are…

C# 使用onnxruntime部署夜间雾霾图像的可见度增强

目录 介绍 模型信息 效果 项目 代码 下载 C# Onnx 使用onnxruntime部署夜间雾霾图像的可见度增强 介绍 github地址&#xff1a;GitHub - jinyeying/nighttime_dehaze: [ACMMM2023] "Enhancing Visibility in Nighttime Haze Images Using Guided APSF and Gradien…

机器视觉系统选型-为什么还要选用工业光源控制器

工业光源控制器最主要的用途是给光源供电&#xff0c;实现光源的正常工作。 1.开关电源启动时&#xff0c;电压是具有波浪的不稳定电压&#xff0c;其瞬间峰值电压超过了LED灯的耐压值&#xff0c;灯珠在多次高压冲击下严重降低了使用寿命&#xff1b; 2.使用专用的光源控制器&…

day2:信号与槽

思维导图 使用手动连接&#xff0c;将登录框中的取消按钮使用t4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断u界面上输入的账号是否为"123",密码是否为"…

【Java系列】JDK

目录 JDK介绍JDK版本系列文章版本记录JDK介绍 JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。 JDK版本 SE(JavaSE),standard edition,标准版,是我们通…

【MySQL】报错 Incorrect string value: ‘\xE5\xA4\xA9\xE5\x96\x9C‘ for column的解决方法

目录 解决方法如下&#xff1a;例如&#xff1a; 在向数据库中插入中文时遇到报错Incorrect string value: \xE5\xA4\xA9\xE5\x96\x9C for column &#xff0c;此时为数据库的编码格式有问题&#xff0c;可以按照如下方法修改 解决方法如下&#xff1a; 使用show create table…

C++学习Day07之动态联编和静态联编

目录 一、程序及输出1.1 静态联编&#xff08;Static Binding&#xff09;1.2 动态联编&#xff08;Dynamic Binding&#xff09; 二、分析与总结 一、程序及输出 C 中的联编&#xff08;Binding&#xff09;分为动态联编&#xff08;Dynamic Binding&#xff09;和静态联编&a…

关于本地docker启动xxl-job

之前通过github拉取xxl-job到本地启动&#xff0c;已经验证完了&#xff0c;主要要记住以下几个步骤: 1.拉取代码 GitHub地址&#xff1a;https://github.com/xuxueli/xxl-job Gitee地址&#xff1a;https://gitee.com/xuxueli0323/xxl-job 2.idea打开&#xff0c;找到tabl…

理解了镜像和容器,你就掌握了Docker的80%!

01、Docker的架构和底层技术 Docker Platform&#xff08;平台&#xff09; Docker提供了一个开发、打包、运行app(应用application)的平台 把app和底层infrastructure(基础设备)隔离开来 Docker Engine 组成 后台进程&#xff08;dockerd&#xff09; 用于一些后台的操作…

4.网络游戏逆向分析与漏洞攻防-游戏启动流程漏洞-模拟游戏登陆器启动游戏并且完成注入

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;游戏启动流程的分析 码云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan 码云版本号&#xff1a;bcf7559184863febdcad819e48aaacad9f25d633 代码下…

Java——重写(Override)与重载(Overload

1.重写&#xff08;Override&#xff09; 重写是子类对父类当中允许访问的方法的实现过程进行重新编写&#xff0c;返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于子类可以根据需要&#xff0c;定义自己特定的行为&#xff0c; 也…

小迪安全29WEB 攻防-通用漏洞SQL 注入增删改查盲注延时布尔报错

#知识点&#xff1a; 1、明确查询方式注入 Payload 2、明确查询方式注入产生功能 3、明确 SQL 盲注延时&布尔&报错 #详细点&#xff1a; 盲注就是在注入过程中&#xff0c;获取的数据不能回显至前端页面。 也就是在代码中无echo将sql结果输出出来 此时&#…

qt_day3

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置账户和密码的登录标签ui->lab1->setPixmap(QPixmap(":/pictrue/wodepeizhenshi.png"));…

【学习心得】编程小白该如何学好C语言(✨新手推荐阅读)

前言 对于刚刚踏入编程领域的小白来说&#xff0c;C语言可能是一个既神秘又充满挑战的领域。但只要你掌握了正确的学习方法&#xff0c;C语言的学习之旅也可以是充满乐趣和成就感的。 一、明确学习目标 对于初学者来说&#xff0c;明确学习目标是学好C语言的第一步。一个清晰…

从零开始学习PX4源码1(两个三维矢量如何转换成四元数)

目录 文章目录 目录摘要参考网址推导过程 摘要 本节主要记录px4如何从两个三维旋转矢量转换到四元数的过程&#xff0c;欢迎批评指正&#xff01;&#xff01;&#xff01; 参考网址 三维矢量转四元数 推导过程