在 Python 中创建线程涉及在程序内启动一个独立的执行流,使得多个操作能够并发运行。这对于同时执行任务特别有用,比如并行处理各种 I/O 操作。
Python 提供了多种创建和管理线程的方式。
使用 threading
模块创建线程通常被推荐,因为它提供了更高层次的接口和附加功能。
另一方面,_thread
模块提供了一个更简单、更低级别的创建和管理线程的方法,这对于简单的、低开销的线程任务非常有用。
在本教程中,您将学习使用不同方法在 Python 中创建线程的基础知识。我们将覆盖使用函数创建线程、扩展 threading
模块中的 Thread
类,以及使用 _thread
模块。
使用函数创建线程
您可以使用 threading
模块中的 Thread
类来创建线程。在这种方法中,您只需将一个函数传递给 Thread
对象即可创建一个线程。下面是启动新线程的步骤:
-
-
使用
Thread
类创建一个 Thread
对象,并传入目标函数及其参数。
-
调用
Thread
对象上的 start
方法以开始执行。
-
可选地,调用
join
方法以等待线程完成后再继续。
示例
下面的示例演示了如何使用线程在 Python 中并发执行。它创建并启动了多个线程,这些线程通过在 Thread
类内指定用户定义的函数作为目标来并发执行不同的任务。
from threading import Thread
def addition_of_numbers(x, y):
result = x + y
print('Addition of {} + {} = {}'.format(x, y, result))
def cube_number(i):
result = i ** 3
print('Cube of {} = {}'.format(i, result))
def basic_function():
print("Basic function is running concurrently...")
Thread(target=addition_of_numbers, args=(2, 4)).start()
Thread(target=cube_number, args=(4,)).start()
Thread(target=basic_function).start()
执行上述程序后,将会产生如下结果:
Addition of 2 + 4 = 6
Cube of 4 = 64
Basic function is running concurrently...
通过扩展 Thread
类创建线程
另一种创建线程的方法是通过扩展 Thread
类。这种方法涉及到定义一个新的类继承自 Thread
并覆盖其 __init__
和 run
方法。下面是启动新线程的步骤:
示例
下面的示例演示了如何使用一个扩展自 threading.Thread
类的自定义 MyThread
类在 Python 中创建和管理多个线程。
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("Starting " + self.name)
print_time(self.name, 5, self.counter)
print ("Exiting " + self.name)
def print_time(threadName, counter, delay):
while counter:
if exitFlag:
threadName.exit()
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
thread1.start()
thread2.start()
print ("Exiting Main Thread")
执行上述代码后,将会产生如下结果:
Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Mon Jun 24 16:38:10 2024
Thread-2: Mon Jun 24 16:38:11 2024
Thread-1: Mon Jun 24 16:38:11 2024
Thread-1: Mon Jun 24 16:38:12 2024
Thread-2: Mon Jun 24 16:38:13 2024
Thread-1: Mon Jun 24 16:38:13 2024
Thread-1: Mon Jun 24 16:38:14 2024
Exiting Thread-1
Thread-2: Mon Jun 24 16:38:15 2024
Thread-2: Mon Jun 24 16:38:17 2024
Thread-2: Mon Jun 24 16:38:19 2024
Exiting Thread-2
使用 start_new_thread()
函数创建线程
_thread
模块中的 start_new_thread()
函数用于在运行的程序中创建一个新线程。这个模块提供了一种低级别的线程方法。它更简单,但没有 threading
模块提供的某些高级特性。
下面是 _thread.start_new_thread()
函数的语法:
_thread.start_new_thread ( function, args[, kwargs] )
这个函数启动一个新的线程并返回它的标识符。函数参数指定了新线程将要执行的函数。任何所需参数都可以通过 args
和 kwargs
传递。
示例
import _thread
import time
def thread_task( threadName, delay):
for count in range(1, 6):
time.sleep(delay)
print ("Thread name: {} Count: {}".format ( threadName, count ))
try:
_thread.start_new_thread( thread_task, ("Thread-1", 2, ) )
_thread.start_new_thread( thread_task, ("Thread-2", 4, ) )
except:
print ("Error: 无法启动线程")
while True:
pass
thread_task("test", 0.3)
它将产生如下输出:
Thread name: Thread-1 Count: 1
Thread name: Thread-2 Count: 1
Thread name: Thread-1 Count: 2
Thread name: Thread-1 Count: 3
Thread name: Thread-2 Count: 2
Thread name: Thread-1 Count: 4
Thread name: Thread-1 Count: 5
Thread name: Thread-2 Count: 3
Thread name: Thread-2 Count: 4
Thread name: Thread-2 Count: 5
Traceback (most recent call last):
File "C:\Users\user\example.py", line 17, in <module>
while True:
KeyboardInterrupt
程序进入无限循环。您需要按下 Ctrl-C 来停止。