python 线程 ~~ ~~~为面试开辟VIP通道~~~~~测试、死锁、全局变量共享、守护主线程等。。。。。。(1)

简介: 线程(英语:thread)是操作系统能够进行运算调度的最小单位。线程很重要,通过本篇文章可以让你们很好的了解线程的传参、线程执行规则、守护主线程、线程间共享全局变量、进程互斥锁、死锁进程怎么解决。希望对你们有所帮助。

在了解线程之间的操作及进程死锁之前先来了解一下什么是进程?以下是官方的解释。

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

线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

一个进程可以有很多线程,每条线程并行执行不同的任务。

在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。


看着是不是非常的晕,没关系,下面让我们用实例来享受线程带来的舒适。

1、线程之元组传参

# TODO                鸟欲高飞,必先展翅
# TODO                 向前的人 :Jhon
#  TODO 元组
import threading
import time
def task(count):
    for i in range(count):
        print("正在工作")
        time.sleep(0.2)
    else:
        print("工作结束")
if __name__ == '__main__':
    #创建子线条程
    task_thred=threading.Thread(target=task,args=(5,))
    task_thred.start()

结果

#   TODO  字典
import threading
import time
def task(count):
    for i in range(count):
        print("正在工作")
        time.sleep(0.2)
    else:
        print("工作结束")
if __name__ == '__main__':
    #创建子进程
    task_thred=threading.Thread(target=task,kwargs={"count":6})
    task_thred.start()

因为

微信图片_20221010125003.png

结果

微信图片_20221010125052.png

2、线程之字典传参

task_thred=threading.Thread(target=task,kwarg={"count":6})创建子线程并将字典{“count”:6}传给task(count)函数,函数中count形参接收。其中target=task,target就是目标,也就是目标函数的意思。字典就类似于json字符串,找个网页单机右键检查找到网络下面的全部,找一个js文件打开(可以不一定是js文件,其他的也可以)刷新一下你就可以发现标头里的都是以字符串显示的微信图片_20221010125132.png

image.png

task_thred.start()就是将上面创建的线程开启,注意一定要开启线程,不然线程开启不了程序无法执行。time.sleep(0.2),休眠0.2秒,看起来卡顿卡顿的,更好的看出进程执行的过程

3、线程执行规则

很显然是无序的,线程和进程都是用于资源调度,是随机分配的,所以是都是无序的。下面通过例子来看一下。image.png

#  TODO  线程之间执行时无序的
import threading
import time
def work1():
    time.sleep(1)
    print("当前的线程是:",threading.current_thread().name)
if __name__ == '__main__':
    for _ in range(5):
        work_thred=threading.Thread(target=work1)
        work_thred.start()

结果:

第一次执行结果image.png

第二次执行结果:

image.png

我们对比两次的执行结果可以发现第一次执行的线程顺序是: 4->5->1->3->2,而蒂维茨执行的县城顺序是: 3->5->2->1->4,很显然两次的执行顺序不一致,所以线程的执行是没有顺序的

4、测试主次线程权限,如何消除权限???又如何巩固主线程的掌控权

测试主线程是否会等待子线程执行完毕关闭,通过下面的例子你可以很好的了解。

# TODO 测试主线程是否会等待子线程执行完毕关闭
import time
import threading
def show_info():
    for i in range(5):
        print("test,",i)
        time.sleep(1)
if __name__ == '__main__':
    show_thted=threading.Thread(target=show_info)
    show_thted.start()
    time.sleep(1.5)
    print("结束")

结果:

image.png

我们可以发现主线程结束后,子进程也停止了执行,达到预期目的,方法可行。

4.1、方法一:

创建进程的时候加入守护进程daemon

# TODO 测试主线程是否会等待子线程执行完毕关闭
import time
import threading
def show_info():
    for i in range(5):
        print("test,",i)
        time.sleep(1)
if __name__ == '__main__':
    show_thted=threading.Thread(target=show_info,daemon=True)
    show_thted.start()
    time.sleep(1.5)
    print("结束")

结果:

image.png

我们可以发现主线程结束后,子进程也停止了执行,达到预期目的,方法可行

4.2、方法二

难道必须在创建进程的时候就要放入守护进程吗?

# TODO 测试主线程是否会等待子线程执行完毕关闭
import time
import threading
def show_info():
    for i in range(5):
        print("test,",i)
        time.sleep(1)
if __name__ == '__main__':
    show_thted=threading.Thread(target=show_info)
    show_thted.setDaemon(True)
    show_thted.start()
    time.sleep(1.5)
    print("结束")

结果:

image.png这样是不是也可以确保主线程停止后子线程跟着停止,ok,达到效果,方法可行。但是你们有没有发现这样很多余,明明一行代码就可以实现的,为什么要多行代码执行呢,但是作为一个方法,记住还是很有必要的。


目录
相关文章
|
4月前
|
机器学习/深度学习 存储 算法
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
3月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
3月前
|
存储 算法 文件存储
探秘文件共享服务之哈希表助力 Python 算法实现
在数字化时代,文件共享服务不可或缺。哈希表(散列表)通过键值对存储数据,利用哈希函数将键映射到特定位置,极大提升文件上传、下载和搜索效率。例如,在大型文件共享平台中,文件名等信息作为键,物理地址作为值存入哈希表,用户检索时快速定位文件,减少遍历时间。此外,哈希表还用于文件一致性校验,确保传输文件未被篡改。以Python代码示例展示基于哈希表的文件索引实现,模拟文件共享服务的文件索引构建与检索功能。哈希表及其分布式变体如一致性哈希算法,保障文件均匀分布和负载均衡,持续优化文件共享服务性能。
|
8月前
|
安全 Linux 网络安全
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
133 2
|
8月前
|
Python Windows 网络安全
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(二)
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(二)
163 2
|
3月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。
|
5月前
|
存储 算法 Serverless
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
|
6月前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
7月前
|
JSON 安全 数据安全/隐私保护
告别密码泄露!Python OAuth与JWT双剑合璧,守护你的数字资产💰
本文探讨了在Python环境中利用OAuth 2.0和JSON Web Tokens (JWT) 提高系统安全性的方法。OAuth 2.0是一种开放标准授权协议,通过用户授权和令牌颁发来保护资源访问。JWT则是一种紧凑、自包含的认证方式,用于安全传输信息。文章详细介绍了如何使用Flask-OAuthlib实现OAuth 2.0认证,以及使用PyJWT生成和验证JWT。结合这两种技术,可以构建出既安全又高效的认证体系,为数据安全提供双重保障。
91 3
|
7月前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
219 1

热门文章

最新文章

推荐镜像

更多