Python 中从线程获取返回值
这篇文章首先讨论了线程的基础知识,并提供了一个在Python中启动线程的代码示例。然后,我们将讨论一个在线程中获取函数返回值的代码。
线程是进程内的轻量级执行单元,具有自己的程序执行状态。一个进程可以运行多个线程以实现并发(有时也是并行)。
进程和线程的主要区别在于每个进程都有一个独立的不相交地址空间,而同一进程的多个线程共享单个进程的地址空间。这意味着线程可以使用共享内存进行通信,而无需额外的管道(普通管道或FIFO)或任何消息传递接口。
在Python中使用多线程的HelloWorld程序
考虑以下代码:
from threading import Thread
# 一个线程的函数
def first_function():
print('Hello World')
print("main program start")
thread_1 = Thread(target=first_function)
thread_2 = Thread(target=first_function)
thread_1.start()
thread_2.start()
print("main ends")
在上面的代码中,首先我们使用 from threading import Thread
语句导入 Thread 类以使用多线程功能。我们定义了一个名为 first_function()
的函数,用于显示 "Hello World",并使用 Thread()
类实例化了两个线程对象。
我们通过将 first_function()
作为目标函数传递给 Thread()
来创建了两个 Thread()
类的实例。target 属性指定要由 Thread()
执行的函数。
一旦创建了 Thread()
实例,我们可以使用 .start()
方法运行和执行这些线程。
在线程中传递参数给函数
考虑以下代码:
from threading import Thread
def first_function(name, id):
print('Hello World from', name, "ID=", id)
thread_1 = Thread(target=first_function, args=("Thread 1", 1))
thread_2 = Thread(target=first_function, args=("Thread 2", 2))
thread_1.start()
thread_2.start()
在上面的代码中,我们定义了一个名为 first_function(name, id)
的函数,它接收两个参数 name 和 id。我们使用 args 在 Thread 类中将这些参数作为元组传递。
我们创建了两个 Thread 类对象,并分别将参数 args=("Thread 1", 1)
和 args=("Thread 2", 2)
传递给 thread_1 和 thread_2。然后,我们使用 thread_1.start()
和 thread_2.start()
来运行这些线程。
在Python中从运行在线程中的函数中获取返回值
有多种方法可以从在线程中运行的函数中获取返回值。
传递一个可变对象给函数
我们可以通过将一个可变对象传递给在线程中运行的函数来获取函数的返回值;函数将返回值放在该对象中。考虑以下代码:
from threading import Thread
def first_function(first_argu, return_val):
print(first_argu)
return_val[0] = "Return Value from " + first_argu
return_val_from_1 = [None] * 1
return_val_from_2 = [None] * 1
thread_1 = Thread(target=first_function, args=("Thread 1", return_val_from_1))
thread_2 = Thread(target=first_function, args=("Thread 2", return_val_from_2))
thread_1.start()
thread_2.start()
thread_1.join()
thread_2.join()
print(return_val_from_1)
print(return_val_from_2)
上面的代码定义了一个名为 first_function 的函数,它接收两个参数 first_argu 和 return_val。first_function 显示 first_argu 的值,并将返回值放在 return_val 的索引 0 处。
我们使用 Thread 类创建线程,并传递两个参数,包括一个列表 args=("Thread 1", return_val_from_1)
和 args=("Thread 2", return_val_from_2)
分别给 thread_1 和 thread_2。return_val_from_1 和 return_val_from_2 用于获取函数的返回值。
thread_1.join()
和 thread_2.join()
用于等待主程序完成这两个线程。
让我们看一下上述代码片段的输出:
使用 join 方法
join 方法是另一种从在线程中获取返回值的方法。考虑以下代码:
from threading import Thread
def first_function(first_argu):
print(first_argu)
return "Return Value from " + first_argu
class NewThread(Thread):
def __init__(self, group=None, target=None, name=None,
args=(), kwargs={}):
Thread.__init__(self, group, target, name, args, kwargs)
def run(self):
if self._target != None:
self._return = self._target(*self._args, **self._kwargs)
def join(self, *args):
Thread.join(self, *args)
return self._return
thread_1 = NewThread(target=first_function, args=("Thread 1",))
thread_2 = NewThread(target=first_function, args=("Thread 2",))
thread_1.start()
thread_2.start()
print(thread_1.join())
print(thread_2.join())
在上面的代码中,我们定义了一个名为 NewThread 的自定义类,它是 Thread 类的子类。我们重新定义了 run 和 join 方法。
一旦我们创建并启动了一个线程,join()
方法将返回从 first_function 返回的值。
以下是上述代码的输出:
相关文章
在 Python 中从文本创建 N-Grams
发布时间:2023/06/21 浏览次数:65 分类:Python
-
本文将讨论如何使用 Python 中的功能和库创建 n-gram。使用 for 循环在 Python 中从文本创建 n-gram 我们可以有效地创建一个 ngrams 函数,该函数接受文本和 n 值,并返回一个包含 n-gram 的列表。
用于 Python 的 Vim 自动完成
发布时间:2023/06/21 浏览次数:180 分类:Python
-
Vim(Vi Improved的缩写)是一款功能强大的文本编辑器,常被作为Python开发环境的首选。本文将探讨Vim及其用于Python的自动补全功能。
Python 数独求解器
发布时间:2023/06/21 浏览次数:187 分类:Python
-
本文介绍了我们如何使用 Python 来解决数独问题。 通过适应回溯算法,它可以作为一个准确的数独解算器。
Python Quine 介绍
发布时间:2023/06/21 浏览次数:167 分类:Python
-
一个Quine是一个产生其源代码作为输出的计算机程序。Quine很有趣,因为它们似乎违背了编程的目的,即根据输入生成输出。运行Python Quine
Python 复利计算器
发布时间:2023/06/21 浏览次数:172 分类:Python
-
Python是用于金融分析的优秀语言,其中之一是可以使用Python计算复利。复利是指利息不仅仅在本金(原始金额)上支付,还包括已累计的利息。本文将讨论Python复利函数。
Python中内存缓存的使用
发布时间:2023/06/21 浏览次数:171 分类:Python
-
本文将讨论准备内存缓存操作和主要的 Memcached 用法。 它还将讨论使用 Python 缓存和设置的高级模式。
Python 缓存库
发布时间:2023/06/21 浏览次数:197 分类:Python
-
Python 缓存库是必不可少的,因为它允许系统管理缓存。 缓存库可以通过提供一种访问缓存数据和管理缓存的方法来帮助提高系统性能。
管理 Python 依赖项
发布时间:2023/06/20 浏览次数:110 分类:Python
-
使用 Python 的挑战之一是管理依赖项。 在本文中,我们将讨论和学习 Python 依赖项的管理。
Python 中的语言检测
发布时间:2023/06/20 浏览次数:66 分类:Python
-
本文介绍了我们如何使用 Python 检测语言。 我们可以使用库或 API、语言模型和语言交叉集。 在 Python 中检测语言时,使用 Python 库是一种常用的技术。