当前位置:网站首页>多线程和并发编程(四)
多线程和并发编程(四)
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方法中需要使用这些变量调用传入的线程函数,并为线程函数传递参数。
边栏推荐
猜你喜欢
字节跳动三面拿offer:网络+IO+redis+JVM+GC+红黑树+数据结构,助你快速进大厂!!
Intelligent security contract - delegatecall (2)
Weekly recommended short video: In order to fill the gap of learning resources, the author specially wrote a book?
Jenkins CI平台(二)
【牛客在线OJ】-字符逆序
学弟:我适不适合转行做软件测试?
Online monitoring of UPS power supply and operating environment in the computer room, the solution is here
不要小看 WebSocket!长连接、有状态、双向、全双工都是王炸技能
5000元价位高性能轻薄本标杆 华硕无双高颜能打
常见荧光染料修饰多种基团及其激发和 发射波长数据一览数据
随机推荐
AI智能剪辑,仅需2秒一键提取精彩片段
cocos creater 3.x 插件安装方法
多商户商城系统功能拆解21讲-平台端分销订单
Mock模拟数据,并发起get,post请求(保姆级教程,一定能成功)
【牛客在线OJ】-字符逆序
2020icpc亚洲区域赛(济南)M题Cook Pancakes(小根堆的应用)
mysql命令
Intelligent security contract - delegatecall (2)
【Django-Docker】Sqlite3.db读取权限不够-20220803
Selenium of reptiles
谷歌浏览器安装插件教程步骤,开发用这2个插件工作效率倍增
cdc抽取mysql整个实例的binlog,有没有方案通过配置的方式将这些库表拆开分发到kafka
有人知道flink sql 使用tableEnv.executeSql执行后,怎么获取到任务运行的
Higher mathematics - chapter ten infinite series - constant term series
你想知道的 Watch App 开发
WEB 渗透之SSRF
warnings.warn(“Title is more than 31 characters. Some applications may not be able to read the file
typescript学习笔记
Big guy, who is free to help me to see what the problem is, I just read MySQL source print, and I just came into contact with flink.
调用EasyCVR云台控制接口时,因网络延迟导致云台操作异常该如何解决?