如何在Python的多个线程上运行相同的函数?
在大型现实世界应用程序中,模块和功能必须经历许多基于输入和输出的任务,例如读取或更新数据库、与不同微服务的通信以及与客户端或对等方的请求响应。这些任务可能需要大量时间才能完成。
服务请求和响应客户端所花费的时间称为延迟,程序员需要尽可能减少延迟。这导致需要并行处理,其中我们的应用程序能够为不同的客户端执行具有不同参数的某些函数或方法。我们可以使用线程来实现这一点。一个线程可以与其他线程并行执行一个函数。每个线程共享相同的代码、数据和文件,而它们有自己的堆栈和寄存器。
使用的模块:
在Python,我们可以使用线程创建和运行线程 模块。 Python的这个模块为线程提供了强大的高级支持。
循序渐进的方法:
- 导入库。我们将使用线程模块来创建和运行线程。为了观察输出,我们将使用time模块创建一些延迟。
import threading
import time
- 定义我们将用于在不同线程上运行的示例函数。在这个例子中,让我们创建一个函数来打印给定列表中数字的平方。
# A sample function to print squares
def print_squares(thread_name, numbers):
for number in numbers:
print(thread_name, number**2)
# Produce some delay to see the output
# syntax: time.sleep(
- 现在使用threading.Thread类创建 2 个或更多线程。创建线程的语法如下:
Syntax: thread_object = threading.Thread(target=
# Creating 3 threads that execute the same function with different parameters
thread1 = threading.Thread(
target=print_squares, args=("thread1", [1, 2, 3, 4, 5]))
thread2 = threading.Thread(
target=print_squares, args=("thread2", [6, 7, 8, 9, 10]))
thread3 = threading.Thread(
target=print_squares, args=("thread3", [11, 12, 13, 14, 15]))
- 现在我们需要开始执行。 Thread 类有一个start()方法,可以在运行模式下传输线程。线程将一直运行,直到它们没有完成。
# Start the threads
thread1.start()
thread2.start()
thread3.start()
- 我们可以使用 Thread 类的join()方法在所有线程未完成时阻止程序执行。
# Join the threads before moving further
thread1.join()
thread2.join()
thread3.join()
下面是完整的代码:
Python3
# Import module
import threading
import time
# A sample function to print squares
def print_squares(thread_name, numbers):
for number in numbers:
print(thread_name, number**2)
# Produce some delay to see the output
time.sleep(1)
# Creating 3 threads that execute the same
# function with different parameters
thread1 = threading.Thread(target=print_squares,
args=("thread1", [1, 2, 3, 4, 5]))
thread2 = threading.Thread(target=print_squares,
args=("thread2", [6, 7, 8, 9, 10]))
thread3 = threading.Thread(target=print_squares,
args=("thread3", [11, 12, 13, 14, 15]))
# Start the threads
thread1.start()
thread2.start()
thread3.start()
# Join the threads before
# moving further
thread1.join()
thread2.join()
thread3.join()
输出: