1. 简介
Python中的多线程(multithreading)是指同时运行多个线程,Python提供了thread
和threading
等模块来支持多线程编程。
2. thread模块
2.1 thread模块的使用
Python中的thread
模块是底层的线程模块,使用该模块需要了解一些线程的基本知识。
以下是一个简单的使用thread
模块的示例:
import thread
import time
# 定义线程函数
def print_time(threadName, delay, count):
while count:
time.sleep(delay)
print("%s: %s" % (threadName, time.ctime(time.time())))
count -= 1
# 创建两个线程
try:
thread.start_new_thread(print_time, ("Thread-1", 1, 5))
thread.start_new_thread(print_time, ("Thread-2", 2, 5))
except:
print("Error: 无法启动线程")
# 主线程等待子线程结束
while 1:
pass
上述代码定义了一个print_time
函数作为线程的执行函数,thread.start_new_thread
函数用于启动线程。在主线程中,使用一个死循环使其等待子线程结束。
3. threading模块
3.1 threading模块的使用
Python中的threading
模块是高级的线程模块,使用该模块可以更方便地实现多线程编程。
以下是使用threading
模块的示例:
import threading
import time
# 定义线程类
class MyThread(threading.Thread):
def __init__(self, threadName, delay, count):
threading.Thread.__init__(self)
self.threadName = threadName
self.delay = delay
self.count = count
def run(self):
print("Starting " + self.threadName)
print_time(self.threadName, self.delay, self.count)
print("Exiting " + self.threadName)
# 定义线程函数
def print_time(threadName, delay, count):
while count:
time.sleep(delay)
print("%s: %s" % (threadName, time.ctime(time.time())))
count -= 1
# 创建两个线程
try:
thread1 = MyThread("Thread-1", 1, 5)
thread2 = MyThread("Thread-2", 2, 5)
thread1.start()
thread2.start()
except:
print("Error: 无法启动线程")
# 主线程等待子线程结束
thread1.join()
thread2.join()
print("Exiting Main Thread")
上述代码定义了一个MyThread
类作为线程的执行类,MyThread
类继承自threading.Thread
类,并重写了run
方法。在主线程中,通过创建MyThread
类的实例并调用start
方法来启动线程。使用join
方法让主线程等待子线程结束。
3.2 threading模块的高级特性
除了可以使用Thread
类来创建线程外,Python的threading
模块还提供了一些高级特性,例如:
Lock
对象,用于控制线程的共享资源的访问。
Condition
对象,用于线程之间的通信,类似于Java中的wait
和notify
机制。
Event
对象,用于线程之间的事件通知。
Semaphore
对象,用于限制线程的并发数量。
以下是一个使用Lock
对象的示例:
import threading
import time
# 定义线程类
class MyThread(threading.Thread):
def __init__(self, threadName, delay, count, lock):
threading.Thread.__init__(self)
self.threadName = threadName
self.delay = delay
self.count = count
self.lock = lock
def run(self):
print("Starting " + self.threadName)
self.lock.acquire()
print_time(self.threadName, self.delay, self.count)
self.lock.release()
print("Exiting " + self.threadName)
# 定义线程函数
def print_time(threadName, delay, count):
while count:
time.sleep(delay)
print("%s: %s" % (threadName, time.ctime(time.time())))
count -= 1
# 创建线程锁
lock = threading.Lock()
# 创建两个线程
try:
thread1 = MyThread("Thread-1", 1, 5, lock)
thread2 = MyThread("Thread-2", 2, 5, lock)
thread1.start()
thread2.start()
except:
print("Error: 无法启动线程")
# 主线程等待子线程结束
thread1.join()
thread2.join()
print("Exiting Main Thread")
上述代码在MyThread
类中添加了一个lock
参数,并在线程执行函数中使用lock.acquire()
和lock.release()
来控制共享资源的访问。
4. 总结
Python的多线程编程可以使用thread
和threading
等模块来实现。其中,thread
是底层的线程模块,使用该模块需要了解一些线程的基本知识;threading
是高级的线程模块,使用该模块可以更方便地实现多线程编程,并提供了一些高级特性,例如:Lock
、Condition
、Event
、Semaphore
等对象,用于控制线程的共享资源的访问、线程之间的通信和事件通知等。