Python线程threading模块用法详解

  • Post category:Python

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参数是定时器需要执行的函数,argskwargs是传递给函数的参数。

代码示例:

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模块的详细介绍,希望对大家有所帮助。