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天前
|
JSON 安全 数据安全/隐私保护
告别密码泄露!Python OAuth与JWT双剑合璧,守护你的数字资产💰
本文探讨了在Python环境中利用OAuth 2.0和JSON Web Tokens (JWT) 提高系统安全性的方法。OAuth 2.0是一种开放标准授权协议,通过用户授权和令牌颁发来保护资源访问。JWT则是一种紧凑、自包含的认证方式,用于安全传输信息。文章详细介绍了如何使用Flask-OAuthlib实现OAuth 2.0认证,以及使用PyJWT生成和验证JWT。结合这两种技术,可以构建出既安全又高效的认证体系,为数据安全提供双重保障。
11 3
|
28天前
|
Java 数据库连接 数据库
不同业务使用同一个线程池发生死锁的技术探讨
【10月更文挑战第6天】在并发编程中,线程池是一种常用的优化手段,用于管理和复用线程资源,减少线程的创建和销毁开销。然而,当多个不同业务场景共用同一个线程池时,可能会引发一系列并发问题,其中死锁就是最为严重的一种。本文将深入探讨不同业务使用同一个线程池发生死锁的原因、影响及解决方案,旨在帮助开发者避免此类陷阱,提升系统的稳定性和可靠性。
40 5
|
1月前
|
JSON 安全 数据安全/隐私保护
告别密码泄露!Python OAuth与JWT双剑合璧,守护你的数字资产💰
【10月更文挑战第2天】密码泄露是互联网安全的重大隐患。为了解决这一问题,开发人员采用更安全的认证机制,如 OAuth 2.0 和 JSON Web Tokens (JWT),以保护用户数字资产。OAuth 2.0 作为一种开放标准授权协议,允许资源拥有者向客户端授予访问权限而不必暴露凭证;JWT 则是一种用于安全传输信息的紧凑格式,能够在各方间传递自包含认证信息。
38 3
|
1月前
|
NoSQL 测试技术 Redis
第一次面试总结 - 迈瑞医疗 - 软件测试
本文是作者对迈瑞医疗软件测试岗位的第一次面试总结,面试结果非常好,但面试过程中没有提问太多技术性问题,主要围绕个人介绍、互相了解、个人规划和项目亮点进行,因此作者认为这次面经的学习意义不大。作者还提到了实习岗位的待遇和工作内容,以及对不同阶段求职者的建议。
32 2
|
2月前
|
运维 测试技术
拆分软件测试流程,一张图秒杀所有面试
本文主要介绍了软件测试流程的核心内容,包括需求分析、测试用例编写、测试执行、缺陷提交及回归测试等关键步骤。以迭代测试为例,详细说明了每个环节的具体操作和注意事项,并提供了一张测试流程图以便理解。测试流程确保了软件质量,是面试中常见的考察点。
60 7
拆分软件测试流程,一张图秒杀所有面试
|
2月前
|
SQL 安全 数据库
Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
46 1
|
2月前
|
SQL 安全 数据库
从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
83 6
|
1月前
|
安全 Java 程序员
【多线程-从零开始-肆】线程安全、加锁和死锁
【多线程-从零开始-肆】线程安全、加锁和死锁
41 0
|
3月前
|
存储 Java
【Java基础面试六】、请介绍全局变量和局部变量的区别
这篇文章介绍了Java中成员变量(通常被称作全局变量)和局部变量的区别,包括它们的定义范围、默认初始值、存储位置和生命周期。
【Java基础面试六】、请介绍全局变量和局部变量的区别
|
2月前
|
安全 算法 数据安全/隐私保护
深度揭秘!Python加密技术的背后,AES与RSA如何守护你的数据安全
【9月更文挑战第10天】随着数字化时代的到来,数据安全成为企业和个人面临的重大挑战。Python 作为功能强大的编程语言,在数据加密领域扮演着重要角色。AES 和 RSA 是两种主流加密算法,分别以对称和非对称加密方式保障数据安全。AES(Advanced Encryption Standard)因其高效性和安全性,在数据加密中广泛应用;而 RSA 则利用公钥和私钥机制,在密钥交换和数字签名方面表现卓越。
80 3