python多线程方法详解

  • Post category:Python

Python多线程是指在同一个程序中运行多个线程,每个线程都可以执行独立的任务。在Python中实现多线程主要有两种方式:使用多线程模块和使用多进程模块。

使用多线程模块

Python中使用多线程模块中的Thread来实现线程。下面是一个使用Thread创建线程的例子:

import threading

def func():
    for i in range(5):
        print("线程1:", i)

thread1 = threading.Thread(target=func)
thread1.start()

for i in range(5):
    print("主线程:", i)

上述代码中,在第3行中定义了一个函数,这个函数将被线程1调用。第5行通过Thread类创建一个线程对象,第一个参数为函数名,第二个参数为函数的参数,如果函数没有参数可以不传。最后通过start()方法启动线程。在主线程中,主线程和线程1同时执行。

线程锁

在多线程中,如果多个线程同时访问一个共享的资源会造成数据竞争,从而导致线程安全问题。线程锁可以解决这个问题。

在Python中,使用threading模块的Lock类和RLock类来实现线程锁。Lock类是普通的锁,一次只能有一个线程访问被保护的资源;RLock类是可重入锁,允许一个线程多次获取锁,从而避免死锁。

下面是一个使用Lock类实现线程锁的例子:

import threading

lock = threading.Lock()
num = 0

def func():
    global num
    for i in range(10000):
        lock.acquire()
        try:
            num += 1
        finally:
            lock.release()

t1 = threading.Thread(target=func)
t2 = threading.Thread(target=func)
t1.start()
t2.start()
t1.join()
t2.join()

print(num)

上述代码中,创建了两个线程,这两个线程都会对全局变量num进行加1的操作。由于多线程同时访问num变量可能会导致数据安全问题,因此使用Lock进行资源锁定。使用with关键字可以更简单的实现上述代码,在with代码块中,acquire方法获取锁,代码执行完成后,自动释放锁。

使用RLock类实现线程锁的例子与上述类似,只需要将Lock类替换为RLock类即可。

总结

本文介绍了Python中多线程的应用,介绍了如何使用Thread来创建线程,以及使用Lock和RLock类实现线程锁。多线程可以提高程序的执行效率,但同时也引入了线程安全问题和数据竞争问题,需要使用线程锁来解决。