Python—多线程编程(一)线程的创建,管理,停止

article/2025/9/16 5:12:41

Python—多线程编程(一)线程的创建,管理,停止

先简单介绍一下线程的概念(以下内容来源于百度):

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

说白了就是线程就是完成某个特定功能的一段代码,但线程的开销要比进程小的多。一个Python程序至少有一个线程,那就是Python的主线程,程序启动后由Python解释器负责创建主线程,程序结束时由Python解释器来负责结束主线程。

接下来就进如主题,Python的多线程编程。

Python中由两个模块可以用来多线程编程,_thread 和 threading。前者提供了多线程编程的低级API,后者提供了更高级的API,使用起来也更加便捷,其时基于_thread的封装,接下来就用thread模块来实现多线程的编写。

1.简单介绍threading模块的三种常用函数:

#Threading模块threading.active_count()   返回当前处于活动状态的线程个数
threading.current_thread()   返回当前的Thread对象
threading.main_thread()    返回主线程对象,主线程是Python解释器启动的线程

上代码试试感觉:

#当前线程
t = threading.current_thread()
#当前线程的名字
print(t.name)
#当前处于活动状态的线程的个数
print(threading.active_count())
#主线程
t = threading.main_thread()
#主线程的名字
print(t.name)

后台结果:
在这里插入图片描述
结果看出,目前的线程为Python的主线程,名字为MainThread

2.创建线程

创建一个可执行的线程需要 线程对象 和 线程体
线程对象:threading模块线程类Thread所创建的对象
线程体:线程的执行函数,线程启动会执行该函数,线程所处理的代码是在线程体中编写的

创建线程体的两种主要的方法:
(1)自定义函数体为线程体
(2)继承Thread类重写run()方法,run()方法作为线程

创建线程对象:
threading.Thread(target = None,name = None,args = ())
target 是线程体,即自定义函数   name 设置线程名,若没有设置则Python解释器会为其自动分配一个名字  args 为自定义函数提供参数,是一个元组类型

自定义函数为线程体(自我感觉这个用起来更方便):

#自定义线程函数
#线程方法
def threading_body():#当前对象线程t = threading.current_thread()for i in range(1,6):#当前线程名print("第{0}次执行线程 {1}".format(i,t.name))#线程休眠time.sleep(1)print("线程{0}执行完成".format(t.name))def main():#创建线程t1对象t1 = threading.Thread(target = threading_body,name = '线程1')#启动线程1t1.start()# 创建线程t2对象t2 = threading.Thread(target = threading_body,name = '线程2')#启动线程2t2.start()if __name__ == '__main__':main()

后台执行结果:
在这里插入图片描述
若没有进行线程休眠,执行结果如下:
在这里插入图片描述
由此可见线程休眠是多么的重要,线程的执行时交替执行的并没有一定的执行顺序

继承重写run()方法:

class MyThread(threading.Thread):def __init__(self,name = None):super().__init__(name = name)def run(self):#当前线程对象t = threading.current_thread()for i in range(1,6):print("第{0}次执行线程{1}".format(i,t.name))time.sleep(1)print("{0}执行完成".format(t.name))def main():#创建线程对象1t1 = MyThread()#启动线程1t1.start()#创建线程2t2 = MyThread()#启动线程2t2.start()if __name__ == '__main__':main()

后台执行结果:
在这里插入图片描述
我在这里并没有设置线程的名字,而是由解释器自动给其分配的名字。

3.线程管理

#线程管理
'''
等待线程结束
当前线程调用t1线程的join()方法时则阻塞当前线程,等待t1线程的结束,如果t1线程结束或等待超时,则当前线程回到活动状态继续执行
value = 0def thread_body():global valueprint("线程1开始执行...")for i in range(3):print("线程1正在执行")value += 1time.sleep(1)print("线程1结束...")def main():t1 = threading.Thread(target = thread_body,name = '线程1')t1.start()print("当前线程名字: ".format(threading.current_thread().name))#当前线程调用t1线程的join方法,阻塞当前线程,等待t1线程结束或等待超时t1.join()print('value = {0}'.format(value))print("主线程结束")if __name__ == '__main__':main()

后台执行结果:
在这里插入图片描述
怎么证明主线程让阻塞了呢,可以将t1.join()这行代码注释掉,执行结果如下:
在这里插入图片描述
这样两张图进行对比,那么就很容易的看出主线程确实让阻塞了

4.线程停止

#线程停止(手动将线程停止)
isrunning = True
def threading_body():while isrunning:print("线程1正在执行")time.sleep(6)print("已退出执行")def main():t1 = threading.Thread(target = threading_body,name = '线程1')t1.start()command = input('输入停止命令:')if command == 'exit':global isrunningisrunning = Falseif __name__ == '__main__':main()

后台执行结果:
在这里插入图片描述
这是我在一本书上学到的内容,和大家一起分享,要是觉得有用的话能不能点个赞呀

未完待续!


http://chatgpt.dhexx.cn/article/D83W1IZg.shtml

相关文章

多线程编程——基础语法篇

多线程编程 文章目录 多线程编程一、Thread1.1 Thread用法一1.2、Thread用法二 (Runnable)1.3、Thread用法三1.4、Thread用法四1.5、Thread用法五(lambda) 二、run 和 start 的区别三、并发编程有何用?四、Thread的方法和属性五、…

Java中的多线程编程(超详细总结)

文章目录 Java中的多线程编程(超详细总结)一、线程与多线程的概念二、线程与进程之间的关系三、一个线程的生命周期四、多线程的目的和意义五、线程的实现的方式 Java中的多线程编程(超详细总结) 一、线程与多线程的概念 线程&a…

Qt实现多线程编程的两种方式

Qt实现多线程编程的两种方式 方式一&#xff1a; 继承自QThread类&#xff0c;覆写run函数。此实现方法只有run函数内的代码是运行在子线程内。 代码示例&#xff1a; #ifndef QDEMOTHREAD_H #define QDEMOTHREAD_H#include <QThread> #include <QDebug>class QD…

Java 多线程编程 实验题

Java 多线程编程 实验二 1.创建键盘操作练习2. 双线程猜数字3. 月亮围绕地球 1.创建键盘操作练习 题目描述&#xff1a; 编写一个Java应用程序&#xff0c;在主线程中再创建两个线程&#xff0c; 一个线程负责给出键盘上字母键上的字母&#xff0c;另一个线程负责让用户在命令…

Python多线程编程(详细:适合小白入门)

目录 前言 一、进程 1.多任务 2.进程 3.多进程完成多任务 3.1进程的创建步骤 3.2通过进程类创建进程对象 3.3创建进程和启动的代码 4. 进程执行带有参数的任务 5.获取进程编号 6.进程的注意点 6.1主进程会等待所有的子进程执行结束后再结束 6.2设置守护主进程&…

使用qt实现多线程编程

目录 1、线程基础 1.1、GUI线程与工作线程 1.2、数据的同步访问 2、QT多线程简介 3、QThread线程类 4、创建并启动线程 QThread类提供不依赖于平台的管理线程的方法。一个QThread类的对象管理一个线程&#xff0c;一 般从QThread继承一个自定义类&#xff0c;并重定义虚函…

ZMQ之多线程编程

使用ZMQ进行多线程编程&#xff08;MT编程&#xff09;将会是一种享受。在多线程中使用ZMQ套接字时&#xff0c;你不需要考虑额外的东西&#xff0c;让它们自如地运作就好。 使用ZMQ进行多线程编程时&#xff0c;不需要考虑互斥、锁、或其他并发程序中要考虑的因素&#xff0c;…

C++之多线程编程

一、并发的实现 1.多进程并发主要解决进程间通信的问题 ①同一电脑上&#xff1a;管道、文件、消息队列、内存共享。 ②不同电脑上&#xff1a;socket网络通信。 2. 单进程中的多个线程并发&#xff08;一个主线程多个子线程实现并发&#xff09; ①一个进程中的所有线程共享内…

Springboot异步多线程编程

文章目录 一、基础知识二、什么时候用同步&异步三、什么时候需要使用多线程四、springboot异步多线程编程实现 一、基础知识 同步&#xff1a;同步就是指一个进程在执行某个请求的时候&#xff0c;若该请求需要一段时间才能返回信息&#xff0c;那么这个进程将会一直等待下…

【线程】多线程编程

目录 一、概念 1.进程与线程的区别是&#xff1f;&#xff08;常问&#xff09; 2.线程与fork系统调用 3.线程的优缺点 4.线程的实现方式 二、线程函数 1.pthread_create 2.pthread_exit 3.pthread_join 4.pthread_cancel 三、线程的使用 1.线程的基本操作 2.并发…

多线程编程及线程间通信机制

对进程线程的印象还是比较好的,这对于学习C高级的朋友是非常重要的,怎样更快的学习到线程的具体使用呢?最好的办法自然是练习再练习,然后还要看很多的代码才是,之前又听说了一个IT同行过劳死,特别的提醒广大的IT从业者,要注意合理的作息习惯,健康才是最重要的,下面结合…

多线程编程

多线程指的是一个程序中包含两个或者两个以上的线程&#xff0c;多线程的提出是为提高代码的执行效率&#xff0c;这就好比工厂中的流水线&#xff0c;只有一条称为单线程&#xff0c;有多条流水线就称为多线程。多线程提高效率的同时由于并发执行的不确定性&#xff0c;导致出…

两种 C++ 多线程编程方式,看完不懂打我...

多线程在实际编程中的重要性不言而喻&#xff0c;对 C 而言&#xff0c;当我们需要使用多线程时&#xff0c;有多种方案可供选择。比如 POSIX 线程 pthread、boost::thread 库、C11 开始支持的 std::thread 库&#xff0c;以及其他一些第三方库 libdispatch&#xff08;GCD&…

ARP攻击模拟工具

以下是本人平时的一些小作品&#xff0c;特此和大家一起分享... ARP攻击模拟工具 第一代 说明&#xff1a; 实现模拟以太网的ARP欺骗攻击和IP地址冲突攻击。 此为本人早期作品&#xff0c;固比较简陋和不完善&#xff0c;漏洞及错误之处可能较多请多多包涵&#xff01; 开发环…

ARP断网攻击

在之前的文章当中&#xff0c;我已经向大家介绍了关于ARP的欺骗原理。再进一步&#xff0c;将其中的原理运用到实战中去&#xff0c;又会有什么效果呢&#xff1f;ARP又可以给我们带来哪些具体的作用呢&#xff1f;毕竟实践要来支撑&#xff0c;我们之前学过的ARP欺骗原理。 我…

ARP-欺骗攻击

测试环境&#xff08;kali:192.168.189.7 win7:192.168.189.6 网关:192.168.189.2&#xff09; arpspoof -i eth0 -t 192.168.189.6 192.168.189.2 &#xff08;目标地址网关地址&#xff09; 接收获取的信息 随意登陆一个网站&#xff0c;可发现用户名及密码已被获取。可以…

ARP攻击原理及解决方法,很实用

故障原因】 局域网内有人使用ARP欺骗的木马程序&#xff08;比如&#xff1a;传奇盗号的软件&#xff0c;某些传奇外挂中也被恶意加载了此程序&#xff09;。 【故障原理】 要了解故障原理&#xff0c;我们先来了解一下ARP协议。 在局域网中&#xff0c;通过ARP协议来完成I…

ARP攻击怎么解决最安全

ARP攻击是指攻击者通过伪造网络中的ARP协议数据包&#xff0c;欺骗其他计算机的网络通信&#xff0c;从而实现中间人攻击等目的。 下面是ARP攻击的解决方法&#xff1a; 静态ARP表绑定MAC地址&#xff1a;在网络管理员的控制下&#xff0c;将主机的IP地址与MAC地址进行绑定&am…

ARP攻击及原理

ARP攻击原理:但凡局域网内存在arp攻击&#xff0c;说明网络存在“中间人” 1.PC1需要跟PC2通信&#xff0c;通过ARP请求包询问PC2的MAC地址&#xff0c;由于采用广播的形式&#xff0c;所以交换机会将ARP请求包从接口PC1广播到PC2和PC3。(注&#xff1a;交换机收到广播/组播/未…

ARP攻击、欺骗及防御

一、广播与广播域概述 1、广播与广播域 广播&#xff1a;将广播地址做为目的地址的数据帧。 广播域&#xff1a;网络中能接收到同一个广播所有节点的集合。 2、MAC地址广播 广播地址为FF-FF-FF-FF-FF-FF 3、IP地址广播 1&#xff09;255.255.255.255 2&#xff09;广播…