Python的线程01 认识线程

简介: 正式的Python专栏第41篇,同学站住,别错过这个从0开始的文章!

前面文章写了很多,都是比较基础的。


这篇开始我们将进入中级编程。处理更加复杂事情。比如本文的线程,咱们先从基础知识入手!


什么是线程?

我们知道工人都是同时在工厂工作,复制各自的工作的。他们就是一个一个独立运行的单位!


线程也是类似这样的一个独立的运行单位,多线程,就是多个独立的运行单位,同时执行同样的事情。


简单这样理解,后面会进行对比。


threading.Thread 类是Python中的线程类,它封装了线程的信息和一些同用的方法。


线程有状态,拿工人一天的状态来比喻很合适,早上上班,然后工作,有时候需要停下来休息,最后下班。


复制运行下面的代码看看:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/21 12:02 上午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : __init__.py.py
# @Project : hello
import threading
mythread = threading.Thread()
print("mythread:", mythread)
print("is_alive:", mythread.is_alive())
mythread.start()
print("mythread:", mythread)
print("is_alive:", mythread.is_alive())

下面是运行结果:

image.png

建议读者先运行一下。


再来解释线程的代码

上面我们使用了threading这个库,然后创建Thread类的对象实例,赋值给mythread变量。


接着打印了对象和线程对象的一个函数is_alive()是否活跃状态。


两次都是False(这个后面再说)


但是第二次我们看到线程对象打印出来变成‘stopped’.


也就是说我们跑完了start函数(该函数为线程启动函数)之后,线程就进入stopped状态了。


上面那个就是线程,可是貌似啥也没做,我们下面让它做点事情呗。


线程触发业务函数,线程调用业务函数

比如这次的业务是:关注和点赞。


def dianzan_guanzhu():
    now = datetime.datetime.now() #初始化时间变量
    name = "python萌新"
    print("%s name:%s" % (now, name)) #第一次打印时间和粉丝名字
    time.sleep(1)
    result = "好棒!" + name + " 关注雷学委,白嫖了好多知识和开发经验!"
    print("%s result:%s" % (now, result)) #第二次打印时间和粉丝活动
    return result

我们可以使用线程来调用。下面学委写了一个带参数的函数。 通过线程调用业务函数的时候指定:

  • target:设置为即将被调用的函数
  • kwargs: 如果有参数,直接通过传递一个k-v dict即可。
def dianzan_guanzhu(name):
    #省略一些代码
mythread = threading.Thread(target=dianzan_guanzhu, kwargs={"name": "python萌新"})

好下面,编写全部代码,使用线程来点赞,和直接调用点赞。

我们看看下面的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/21 12:02 上午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : __init__.py.py
# @Project : hello
import threading
import datetime
import time
"""学委定义了一个关注函数"""
def dianzan_guanzhu():
    now = datetime.datetime.now()
    name = "python萌新"
    print("%s name:%s" % (now, name))
    time.sleep(1)
    result = "好棒!" + name + " 关注雷学委,学到了好多知识和开发经验!"
    print("%s result:%s" % (now, result))
    return result
mythread = threading.Thread(target=dianzan_guanzhu)
print("mythread:", mythread)
print("is_alive:", mythread.is_alive())
mythread.start()
print("mythread:", mythread)
print("is_alive:", mythread.is_alive())
dianzan_guanzhu()
print("is_alive:", mythread.is_alive())

直接复制运行,这里我们这个dianzan_guanzhu函数被调用了两次

第一次是mythread.start函数。

第二次是我们直接脱离线程调用dianzan_guanzhu函数。

下面是运行结果:


image.png

好像没啥的样子。


再看一次,注意关注每次打印的时间,输入的时间好像错乱了?没错,不是眼花,是正确运行结果。


因为进入dianzan_guanzhu函数之后,初始化了now变量,这个时间固定了。


但是在线程外面也调用dianzan_guanzhu函数,所以这里是:两个线程在同时做同样的事情。


多了一个线程是哪个?

这里补充一下,我们写python脚本,运行代码的时候,本身是在一个主线程中的。


只是之前一直没解除线程概念,没写多线程程序,没有感知到这事情。


从现在开始,你要清楚知道:每个程序运行都有一个主线程。


回到结果,两个线程先后依次调用通过函数:


首先,先后依次打印第一行输出。

分开休眠了一秒(sleep(1))。

最后,先后依次打印第二行输出。


总结

我们先把线程的基础知识搞懂。


每个程序运行过程中至少有一个主线程

需要启动更多线程使用Thread类来做, target参数用来绑定业务函数。启动线程用start函数。

下一节再分享线程的更多知识。


目录
相关文章
|
12天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
6天前
|
Java Unix 调度
python多线程!
本文介绍了线程的基本概念、多线程技术、线程的创建与管理、线程间的通信与同步机制,以及线程池和队列模块的使用。文章详细讲解了如何使用 `_thread` 和 `threading` 模块创建和管理线程,介绍了线程锁 `Lock` 的作用和使用方法,解决了多线程环境下的数据共享问题。此外,还介绍了 `Timer` 定时器和 `ThreadPoolExecutor` 线程池的使用,最后通过一个具体的案例展示了如何使用多线程爬取电影票房数据。文章还对比了进程和线程的优缺点,并讨论了计算密集型和IO密集型任务的适用场景。
23 4
|
13天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
20天前
|
Java Python
python知识点100篇系列(16)-python中如何获取线程的返回值
【10月更文挑战第3天】本文介绍了两种在Python中实现多线程并获取返回值的方法。第一种是通过自定义线程类继承`Thread`类,重写`run`和`join`方法来实现;第二种则是利用`concurrent.futures`库,通过`ThreadPoolExecutor`管理线程池,简化了线程管理和结果获取的过程,推荐使用。示例代码展示了这两种方法的具体实现方式。
python知识点100篇系列(16)-python中如何获取线程的返回值
|
27天前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
26 3
|
30天前
|
并行计算 安全 Java
Python 多线程并行执行详解
Python 多线程并行执行详解
56 3
|
2月前
|
Python
5-5|python开启多线程入口必须在main,从python线程(而不是main线程)启动pyQt线程有什么坏处?...
5-5|python开启多线程入口必须在main,从python线程(而不是main线程)启动pyQt线程有什么坏处?...
|
2月前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
55 3
|
23天前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
51 0
|
1月前
|
安全 Java 数据库连接
Python多线程编程:竞争问题的解析与应对策略
Python多线程编程:竞争问题的解析与应对策略
18 0