在Python中通过threading模块定义和调用线程的方法
Python中的线程是轻量级的执行单元,一个进程可以包含多个线程。通过多线程的方式,可以让代码同时执行多项任务,从而提高程序的执行效率。在Python中,通过threading模块可以方便的定义和调用线程。
一、定义线程
线程的定义可以通过两种方式实现。第一种方式是定义一个Thread类的子类,并重写其run()方法。具体实现方式如下:
from threading import Thread
import time
class MyThread(Thread):
def run(self):
for i in range(5):
print('线程名:', self.name, '执行时间:', time.ctime(time.time()))
time.sleep(1)
if __name__ == '__main__':
threads = []
for i in range(5):
t = MyThread()
threads.append(t)
for t in threads:
t.start()
t.join()
以上代码首先定义一个MyThread类,继承了Thread类,并且重写了run()方法。在run()方法中,线程要执行的任务可以在此处实现。接着创建了5个线程,并将这些线程添加到一个列表中。然后通过循环启动所有的线程,并调用join()方法等待所有线程执行完毕。
第二种方式是直接创建Thread实例,并传递一个可调用的对象作为参数。具体实现方式如下:
import threading
import time
def worker(num):
print('线程%s开始执行' % num)
time.sleep(1)
print('线程%s执行结束' % num)
if __name__ == '__main__':
threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
for t in threads:
t.start()
t.join()
以上代码首先定义了一个worker函数作为线程的执行任务,并且创建了5个Thread实例。对于每个Thread实例,可以通过target参数指定这个线程要执行的任务,并通过args参数传递参数给任务函数。接着通过循环启动所有的线程,并调用join()方法等待所有线程执行完毕。
二、启动线程
调用start()方法可以启动一个线程,并开始执行线程的任务。例如:
if __name__ == '__main__':
threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
for t in threads:
t.start()
上面的代码启动了5个线程,并开始执行它们的任务。
三、等待线程执行完成
在线程执行过程中,若想等待线程执行完毕,可以调用join()方法等待线程执行完成。例如:
if __name__ == '__main__':
threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
上面的代码先启动了5个线程,并在所有线程都执行完毕后才结束程序的运行。
四、线程同步
多个线程同时访问共享资源时,可能会造成数据竞争的问题,从而导致数据出现异常。因此,在进行多线程编程时,需要使用线程同步来保证数据的安全性。Python中提供了多种线程同步的方式,包括锁(Lock)、条件变量(Condition)、信号量(Semaphore)和事件(Event)等。
摘要:本文介绍了在Python中通过threading模块定义和调用线程的方法,包括线程的定义、启动和等待等,同时还介绍了线程同步的方法,以保证数据的安全性。
关键词:Python、线程、threading、线程同步、锁、条件变量、信号量、事件