当前位置:网站首页>多线程和并发编程(四)
多线程和并发编程(四)
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方法中需要使用这些变量调用传入的线程函数,并为线程函数传递参数。
边栏推荐
猜你喜欢
随机推荐
【Deliberately practice the view of the back tube】deliberately practice
5v2.1a给5v2a充电行吗
With the help of Kubernetes kubekey speed installation
online 方式创建索引触发trigger怎么办?
爬虫之selenium
调用EasyCVR云台控制接口时,因网络延迟导致云台操作异常该如何解决?
智能合约安全——delegatecall (2)
注意力机制的详细理解
ImportError: /lib/libgdal.so.26: undefined symbol: sqlite3_column_table_name
Oracle备份的几种方式
ASA归因:如何评估关键词的投放价值
【美丽天天秒】链动2+1模式开发
借助Web3盘活日本优质IP:UneMeta 与 OpenSea 的差异化竞争
【Azure 事件中心】使用Azure AD认证方式创建Event Hub Consume Client + 自定义Event Position
域名抢注“卷”到了表情包?ENS逆势上涨的新推力
【白话模电2】二极管特性和分类
2022/08/02------Ugly number
【Django-Docker】Sqlite3.db读取权限不够-20220803
Arduino实验三:继电器实验
2022/08/02------丑数









