python 使用多线程
什么是线程?
在软件编程中,线程是具有独立指令集的最小执行单元。它是进程的一部分,并在共享程序相同的可运行资源(如内存)中运行。线程有一个起点、一个执行序列和一个结果。它有一个指令指针,该指针保存线程的当前状态,并控制下一步以什么顺序执行什么。
举个通俗的例子,进程相当于工厂的多个独立生产成品的车间,线程相当于每个车间中生产的各个环节。
什么是计算机科学中的多线程?
一个进程可以并行执行多个线程的能力称为多线程。理想情况下,多线程可以显著提高任何程序的性能。Python多线程机制非常友好,易于学会。
多线程的优势
一个进程的所有线程都可以访问它的全局变量。如果一个全局变量在一个线程中发生变化,那么它对其他线程也是可见的。线程也可以有自己的局部变量。
多线程的缺点
在单处理器系统上,多线程不会影响计算速度。由于管理线程的开销,性能可能会下降。
多线程增加了程序的复杂性,因此也增加了调试的难度。
python 中多线程模块
python3中多线程是threading.
- threading.activeCount(): 找出活动线程对象的总数。
- threading.currentThread(): 确定调用方的线程控件中的线程对象的数量。
- threading.enumerate(): 提供当前活动的线程对象的完整列表。
除了上述方法之外,threading
模块还提供了Thread
类,您可以尝试使用它来实现线程。它是Python多线程的面向对象变体。
The <Thread> class publishes the following methods.
Class Methods | Method Description |
---|---|
run(): | 它是任何线程的入口函数。 |
start(): | start()方法在调用时触发一个线程。 |
join([time]): | join()方法允许程序等待线程终止。 |
isAlive(): | isAlive()方法验证线程是否是活动的。 |
getName(): | getName()方法检索线程的名称。 |
setName(): | setName() 方法的作用是更新线程的名称。 |
使用threading
模块实现线程的步骤
您可以按照以下步骤使用threading
模块实现一个新线程。
- 从
Thread
类构造一个子类。 - 覆盖
init__(self [,args])
方法,根据需求提供参数。 - 接着重写
run(self [,args])
方法来编写线程的业务逻辑。
一旦定义了新的Thread
子类,就必须实例化它来启动一个新线程。然后,调用start()
方法来初始化它。它最终将调用run()
方法来执行任务逻辑。
基础多线程例子
#Python multithreading example to print current date.
#1. Define a subclass using threading.Thread class.
#2. Instantiate the subclass and trigger the thread.
import threading
import datetime
class myThread (threading.Thread):
def __init__(self, name, counter):
threading.Thread.__init__(self)
self.threadID = counter
self.name = name
self.counter = counter
def run(self):
print("
Starting " + self.name)
print_date(self.name, self.counter)
print("Exiting " + self.name)
def print_date(threadName, counter):
datefields = []
today = datetime.date.today()
datefields.append(today)
print("{}[{}]: {}".format( threadName, counter, datefields[0] ))
# Create new threads
thread1 = myThread("Thread", 1)
thread2 = myThread("Thread", 2)
# Start new Threads
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("
Exiting the Program!!!")
程序输出
Starting Thread
Thread[1]: 2019-04-28
Exiting Thread
Starting Thread
Thread[2]: 2019-04-28
Exiting Thread
Exiting the Program!!!
Python多线程——同步线程
threading
模块具有实现锁的内置功能,允许同步线程。需要使用锁定来控制对共享资源的访问,以防止损坏或丢失数据。
你可以调用Lock()方法来应用锁,它会返回新的锁对象。然后,您可以调用lock对象的acquire(blocking)方法来强制线程同步运行。
可选的阻塞(blocking)参数指定线程是否等待获取锁。
- blocking = 0: 如果线程未能获得锁,则立即返回零值,如果锁成功,则返回一值。
- blocking = 1: 线程阻塞并等待锁被释放。
lock对象的release()方法用于在不再需要锁时释放锁。
多线程锁的例子
#Python multithreading example to demonstrate locking.
#1. Define a subclass using threading.Thread class.
#2. Instantiate the subclass and trigger the thread.
#3. Implement locks in thread's run method.
import threading
import datetime
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, name, counter):
threading.Thread.__init__(self)
self.threadID = counter
self.name = name
self.counter = counter
def run(self):
print("
Starting " + self.name)
# Acquire lock to synchronize thread
threadLock.acquire()
print_date(self.name, self.counter)
# Release lock for the next thread
threadLock.release()
print("Exiting " + self.name)
def print_date(threadName, counter):
datefields = []
today = datetime.date.today()
datefields.append(today)
print("{}[{}]: {}".format( threadName, counter, datefields[0] ))
threadLock = threading.Lock()
threads = []
# Create new threads
thread1 = myThread("Thread", 1)
thread2 = myThread("Thread", 2)
# Start new Threads
thread1.start()
thread2.start()
# Add threads to thread list
threads.append(thread1)
threads.append(thread2)
# Wait for all threads to complete
for thread in threads:
thread.join()
print("
Exiting the Program!!!")
程序输出
Starting Thread
Thread[1]: 2019-04-28
Exiting Thread
Starting Thread
Thread[2]: 2019-04-28
Exiting Thread
Exiting the Program!!!