Python是一门支持多线程编程的语言,它提供了threading和Thread模块来支持多线程编程。线程是程序中一个独立的执行流程,Python中的多线程可以充分利用多核CPU的优势,从而提高程序的并发能力和效率。
Thread模块
Thread模块是Python提供的最简单的多线程实现方式,它包含了线程相关的一些基础操作函数和类。在使用Thread模块时,需要导入thread模块,然后创建线程实例,最后通过调用线程实例的start()方法启动线程。
创建线程
Thread模块提供了Thread类用于创建线程。下面是一个示例:
import thread
import time
# 定义线程函数
def print_time(thread_name, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print(thread_name + ": " + time.ctime(time.time()))
# 创建线程实例
try:
thread.start_new_thread(print_time, ("Thread-1", 1))
thread.start_new_thread(print_time, ("Thread-2", 2))
except:
print("Error: unable to start thread")
# 等待所有线程执行完毕
while True:
pass
在该示例中,我们使用thread模块中的start_new_thread()函数创建了两个线程实例,这两个线程分别使用不同的时间间隔来输出当前时间。我们还使用一个无限循环语句来等待所有线程执行完毕。需要注意的是,在使用Thread模块时,主线程必须一直运行,否则子线程也会退出。
线程同步
多线程程序中,为了确保多个线程之间的访问安全,需要使用线程同步。Thread模块提供了Lock类用于实现线程同步。下面是一个示例:
import thread
import time
# 定义全局变量
count = 0
lock = thread.allocate_lock()
# 定义线程函数
def increment_count():
global count, lock
lock.acquire()
count += 1
time.sleep(1)
print("New Count: ", count)
lock.release()
# 创建线程实例
try:
thread.start_new_thread(increment_count, ())
thread.start_new_thread(increment_count, ())
except:
print("Error: unable to start thread")
# 等待所有线程执行完毕
while True:
pass
在该示例中,我们定义了一个全局变量count,并使用Lock类中的acquire()和release()方法获取和释放锁。在每个线程执行完对count的操作后,我们都会输出更新后的count值,以便观察线程同步的效果。
threading模块
threading模块是Python比较高级的多线程实现方式,它在Thread模块的基础上提供了更多的高级功能,如线程间通信、定时器等。在使用threading模块时,需要导入threading模块,然后通过继承Thread类或使用函数式编程来创建线程。
创建线程
下面是通过继承Thread类来创建线程的示例:
import threading
import time
# 定义线程类
class MyThread(threading.Thread):
def __init__(self, thread_name, delay):
threading.Thread.__init__(self)
self.thread_name = thread_name
self.delay = delay
# 线程执行的函数
def run(self):
count = 0
while count < 5:
time.sleep(self.delay)
count += 1
print(self.thread_name + ": " + time.ctime(time.time()))
# 创建线程实例
thread1 = MyThread("Thread-1", 1)
thread2 = MyThread("Thread-2", 2)
# 启动线程
thread1.start()
thread2.start()
# 等待线程结束
thread1.join()
thread2.join()
在该示例中,我们通过继承Thread类来创建线程,在自定义的线程类MyThread中重写run()方法来定义线程执行的具体操作。在创建线程实例后,我们直接调用线程实例的start()方法来启动线程,然后使用线程实例的join()方法等待线程执行完成。
下面是通过函数式编程来创建线程的示例:
import threading
import time
# 定义线程函数
def print_time(thread_name, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print(thread_name + ": " + time.ctime(time.time()))
# 创建线程实例
thread1 = threading.Thread(target=print_time, args=("Thread-1", 1))
thread2 = threading.Thread(target=print_time, args=("Thread-2", 2))
# 启动线程
thread1.start()
thread2.start()
# 等待线程结束
thread1.join()
thread2.join()
在该示例中,我们使用threading模块的Thread类来创建线程实例,同时使用target和args参数来指定线程执行的函数和参数。
线程同步
和Thread模块类似,threading模块也提供了Lock类用于实现线程同步。下面是一个示例:
import threading
import time
# 定义全局变量
count = 0
lock = threading.Lock()
# 定义线程函数
def increment_count():
global count, lock
lock.acquire()
count += 1
time.sleep(1)
print("New Count: ", count)
lock.release()
# 创建线程实例
thread1 = threading.Thread(target=increment_count)
thread2 = threading.Thread(target=increment_count)
# 启动线程
thread1.start()
thread2.start()
# 等待线程结束
thread1.join()
thread2.join()
在该示例中,我们定义了一个全局变量count,并使用Lock类中的acquire()和release()方法获取和释放锁。和Thread模块的示例类似,我们在每个线程执行完对count的操作后,都会输出更新后的count值,以便观察线程同步的效果。
注意,需要使用threading模块的Lock类来代替Thread模块的lock实现线程同步,因为在Python3中,thread模块已经将锁的实现移到了_thread实现中,不再提供独立的Lock类。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python threading和Thread模块及线程的实现 - Python技术站