当前位置:网站首页>多线程和并发编程(四)
多线程和并发编程(四)
2022-08-03 18:26:00 【And ν】
目录
多线程和并发编程(四)
线程
线程也是实现多任务的一种方式,一个进程中,也经常需要同时做多件事,就需要同时运行多个‘子任务’,这些子任务就是线程。一个进程可以拥有多个并行的线程,其中每一西个线程,共享当前进程的资源。
区别 | 进程 | 线程 |
---|---|---|
根本区别 | 作为资源分配的单位 | 调度和执行的单位 |
开销 | 每一个进程都有独立的代码和数据空间,进程间的切换会有较大的开销 | 线程可以看出是轻量级的进程, 多个线程共享内存,线程切换的开销小. |
所处环境 | 在操作系统中,同时运行的多个任务 | 在程序中多个顺序流同时执行 |
分配内存 | 系统在运行的时候为每一个进程分配不同的内存区域 | 线程所使用的资源是他所属进程的资源 |
包含关系 | 一个进程内可以拥有多个线程 | 线程是进程的一部分,所有线程有时候称为是轻量级的进程 |
进程和线程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护,而进程正相反。
在Python程序中,可以通过“—thread" 和threading (推荐使用)这两个模块来处理线程。在Python3中,thread 模块已经废弃。可以使用threading模块代替。所以,在Python3中不能再使用thread模块,但是为了兼容Python3以前的程序,在Python3中将thread模块重命名为“_thread" 。
_thread
在Python程序中,可以通过两种方式来使用线程:使用函数或者使用类来包装线程对象。当使用thread模块来处理线程时,可以调用里面的函数start new_thread0来生成-一个新的线程,语法格式如下:
_thread.start new_thread ( function, args[, kwargs] )
其中function是线程函数; args 表示传递给线程函数的参数,他必须是个tuple类型;kwargs是可选参数。
[示例]使用_ thread 模块创建线程
# 导入模块
import _thread
import time
def fun1():
print("开始运行fun1")
time.sleep(4)
print("运行fun1结束")
def fun2():
print("开始运行fun2")
time.sleep(2)
print("运行fun2结束")
if __name__=='__main__':
print("开始运行")
# 创建线程
_thread.start_new_thread(fun1,())
_thread.start_new_thread(fun2,())
time.sleep(7)
从程序运行结果可以看出,在fun2函数中调用了sleep 函数休眠,当休眠期间,会释放CPU的计算资源,这时fun1 抢占了CPU资源开始执行。
[示例]为线程传递参数
import _thread
import time
def fun1(thread_name,delay):
print("开始运行fun1,线程的名:",thread_name)
time.sleep(delay)
print("运行fun1结束")
def fun2(thread_name,delay):
print("开始运行fun2,线程的名:",thread_name)
time.sleep(delay)
print("运行fun2结束")
if __name__=='__main__':
print("开始运行")
# 创建线程
_thread.start_new_thread(fun1,("thread-1",3))
_thread.start_new_thread(fun2,("thread-2",3))
time.sleep(7)
threading模块
Python3通过两个标准库_ thread 和threading 提供对线程的支持。—thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于threading 模块的功能还是比较有限的。threading模块除了包含_thread 模块中的所有方法外,还提供的其他方法:
1. threading currentThread(): 返回当前的线程变量。
2.threading .enumerate():返回-一个包含正在运行的线程的list。 正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
3.threading activeCount():返回正在运行的线程数量,与len(hreading enumerate())有相同的结果。
在Python3程序中,对多线程支持最好的是threading模块,使用这个模块,可以灵活地创建多线程程序,并且可以在多线程之间进行同步和通信。在Python3程序中,可以通过如下两种方式来创建线程:
1. 通过threading.Thread 直接在线程中运行函数
2.通过继承类threading.Thread来创建线程
在Python中使用threading.Thread的基本语法格式如下所示:
Thread(group=None, target=None, name=None, args=(), kwargs={})
其中target:要执行的方法; name: 线程右: args/kwargs: 要传入方法的参数。
Thread类的方法如表所示:
方法名 | 描述 |
---|---|
run() | 用以表示线程活动的方法 |
start() | 启动线程活动 |
join([time]) | 等待至线程中止。这阻塞调用线程直至线程的join()方法被调用中止-正常退出或者拋出未处理的异常-或者是可选的超时发生 |
isAlive() | 返回线程是否活动的 |
getName() | 返回线程名 |
setName() | 设置线程名 |
在Python中,通过继承类threading.Thread的方式来创建-一个线程。 这种方法只要重载类threading.Thread中的方法run(,然后再调用方法start0就能创建线程,并运行方法run0中的代码。
[示例]继承threading.Thread类创建线程
# 导入模块
import threading
import time
def fun1(thread_name,delay):
print("线程{}开始执行fun1".format(thread_name))
time.sleep(delay)
print("线程{}运行fun1结束".format(thread_name))
def fun2(thread_name,delay):
print("线程{}开始执行fun2".format(thread_name))
time.sleep(delay)
print("线程{}运行fun结束".format(thread_name))
if __name__=='__main__':
print("开始运行")
# 创建线程
t1=threading.Thread(target=fun1,args=('thread-1',2))
t2=threading.Thread(target=fun2,args=('thread-2',2))
# 启动线程
t1.start()
t2.start()
t1.join()
t2.join()
在调用Thread类的构造方法时,需要将线程函数、参数等值传入构造方法,其中name表示线程的名字,如果不指定这个参数,默认的线程名字格式为Thread-1、 Thread-2。 每一个传入构造方法的参数值,在Thread类中都有对应的成员变量保存这些值,这些成员变量都以下划线( )开头,如果_ target、_ args 等。在run方法中需要使用这些变量调用传入的线程函数,并为线程函数传递参数。
边栏推荐
猜你喜欢
技术干货|如何将 Pulsar 数据快速且无缝接入 Apache Doris
MySQL 啥时候用表锁,啥时候用行锁?这些你都应该知道吧
MD5是对称加密还是非对称加密,有什么优缺点
5000元价位高性能轻薄本标杆 华硕无双高颜能打
6000 字+,帮你搞懂互联网架构演变历程!
MySQL database account management and optimization
Shell:循环语句
【Azure 事件中心】使用Azure AD认证方式创建Event Hub Consume Client + 自定义Event Position
【汇编语言03】第2章 寄存器——实验1:查看CPU和内存,用机器指令和汇编指令编程
H.265网页播放器EasyPlayer获取视频流正常,但是播放出现黑屏是什么原因?
随机推荐
EasyNTS上云网关断电重启后设备离线是什么原因?
使用range-based for循环的注意事项
[数据集][VOC]老鼠数据集voc格式3001张
dd命令:用于读取、转换并输出数据
select......for update 语句的功能是什么? 会锁表还是锁行?
超T动力 焕“芯”出发 | 中国重汽专属定制版WP14T产品闪耀登场
技术干货|如何将 Pulsar 数据快速且无缝接入 Apache Doris
Gson 学习笔记
China Hashpower Conference Ascension Kunpeng Ecological Forum was held; Kuaishou established an independent to B business department…
[Azure Event Hub] Create Event Hub Consume Client + Custom Event Position with Azure AD Authentication
多商户商城系统功能拆解21讲-平台端分销订单
【美丽天天秒】链动2+1模式开发
gcc的学习及 版本太低如何在conda环境下重新进行安装
MVCC多版本并发控制的理解
什么是鉴权?一篇文章带你了解postman的多种方式
【HCIP】MPLS实验
【Django-Docker】Sqlite3.db读取权限不够-20220803
VsCode preview Geojson data
With the help of Kubernetes kubekey speed installation
ImportError: /lib/libgdal.so.26: undefined symbol: sqlite3_column_table_name