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类实现线程锁。多线程可以提高程序的执行效率,但同时也引入了线程安全问题和数据竞争问题,需要使用线程锁来解决。