Python线程threading模块用法详解
什么是线程
线程是计算机程序的执行流程。每当运行一个程序,操作系统就会为其创建一个进程,进程内可以包含多个线程,每个线程操作不同的工作,使得程序可以在同一时间内执行多个操作。线程可以帮助程序实现并发操作,提高程序的执行效率。
Python是一门解释型的编程语言,其解释器会从程序的头部开始逐行解释执行,因此Python程序默认是单线程的。然而,对于一些需要同时执行多个任务的程序来说,单线程的执行效率难以满足需求,此时就可以使用Python的线程模块——threading来实现多线程执行。
threading模块常用方法
创建线程
threading模块提供了Thread类来创建线程。创建线程的基本语法如下:
t = threading.Thread(target=func, args=(args,))
其中,target
参数为线程需要执行的函数,args
参数是传递给函数的参数(以元组的形式传入)。
代码示例:
import threading
# 定义线程需要执行的函数
def worker(num):
print(f'thread {num} is working...\n')
# 创建5个线程
for i in range(5):
t = threading.Thread(target=worker, args=(i+1,))
t.start()
运行代码程序会创建5个线程,每个线程执行函数worker,传入的参数分别为1, 2, 3, 4, 5. 执行的结果为:
thread 1 is working...
thread 2 is working...
thread 3 is working...
thread 5 is working...
thread 4 is working...
线程同步
在多线程执行中,如果多个线程操作同一份资源,就可能会出现不同线程之间的竞争,这时就需要线程同步来保证资源的正确访问。
threading模块提供了多种线程同步的方法,比如Lock、RLock、Semaphore等。其中,Lock是一种最常用的同步方法,其基本语法如下:
lock = threading.Lock()
lock.acquire()
# 对共享资源进行修改
lock.release()
其中,acquire()
和release()
用来控制线程的访问权限。如果某个线程想要访问共享资源,就需要先调用acquire()
获取锁,获取成功后才能对资源进行修改。修改完成后记得调用release()
,释放锁,以便其他线程继续访问资源。
代码示例:
import threading
# 定义全局变量count
count = 0
# 定义锁
lock = threading.Lock()
# 定义线程实现的函数
def worker():
global count
for i in range(100000):
lock.acquire() # 获取锁
count += 1
lock.release() # 释放锁
# 创建10个线程
threads = []
for i in range(10):
t = threading.Thread(target=worker)
threads.append(t)
# 启动所有线程
for t in threads:
t.start()
# 等待所有线程执行完成
for t in threads:
t.join()
# 输出计数器的结果
print(f'count={count}')
运行结果为:
count=1000000
定时器
定时器是指在某个时间段之后执行某个操作。threading模块提供了Timer类来实现定时器的功能。
Timer的创建语法如下:
timer = threading.Timer(interval, function, args=None, kwargs=None)
其中,interval
参数是定时器执行的时间间隔(单位为秒),function
参数是定时器需要执行的函数,args
和kwargs
是传递给函数的参数。
代码示例:
import threading
# 定义定时器需要执行的函数
def print_hello():
print('hello world')
# 创建定时器
t = threading.Timer(2, print_hello)
# 启动定时器
t.start()
# 等待定时器执行完成
t.join()
运行代码,2秒后会在控制台上输出”hello world”。
总结
多线程可以提高程序的执行效率,在Python中,使用threading模块可以简单方便地实现多线程。不过,在多线程的执行中,需要注意线程同步,以保证共享资源的正确访问。
以上是Python线程threading模块的详细介绍,希望对大家有所帮助。