Python实现从线程获取返回值

 更新时间:2024年09月10日 08:42:56   作者:迹忆客  
本文介绍了Python中线程的概念、创建线程的方法和在线程中获取函数返回值的技巧,线程作为进程中的执行单元,可以实现程序的并发运行,文章通过示例代码展示了如何在Python中使用Thread类创建线程,并讲解了在线程中传递参数和获取返回值的方法

这篇文章首先讨论了线程的基础知识,并提供了一个在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 返回的值。

以下是上述代码的输出:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • django注册用邮箱发送验证码的实现

    django注册用邮箱发送验证码的实现

    这篇文章主要介绍了django注册用邮箱发送验证码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 基于python纯函数实现井字棋游戏

    基于python纯函数实现井字棋游戏

    这篇文章主要介绍了基于python纯函数实现井字棋游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • python从sqlite读取并显示数据的方法

    python从sqlite读取并显示数据的方法

    这篇文章主要介绍了python从sqlite读取并显示数据的方法,涉及Python操作SQLite数据库的读取及显示相关技巧,需要的朋友可以参考下
    2015-05-05
  • python不带重复的全排列代码

    python不带重复的全排列代码

    输入起始数字和结束数字将数组全排列,需要的朋友可以参考下
    2013-08-08
  • 基于Python编写简易文字语音转换器

    基于Python编写简易文字语音转换器

    这篇文章主要为大家介绍了如何利用Python编写一个简易文字语音转换器,并打包成exe。文中的示例代码讲解详细,感兴趣的小伙伴快跟随小编一起尝试一下
    2022-03-03
  • Python利用随机函数生成变化图形详解

    Python利用随机函数生成变化图形详解

    这篇文章主要介绍了如何在Python中利用随机函数生成变化的图形,文中的示例代码讲解详细,对我们学习有一定吧参考价值,需要的可以了解一下
    2022-04-04
  • Python数据分析之matplotlib绘图详解

    Python数据分析之matplotlib绘图详解

    这篇文章主要为大家详细介绍了Python数据分析之如何利用matplotlib进行绘图,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-09-09
  • Python中使用 Selenium 实现网页截图实例

    Python中使用 Selenium 实现网页截图实例

    这篇文章主要介绍了Python中使用 Selenium 实现网页截图实例,Selenium支持Java、C#、Ruby 以及 Python等语言,本文以Python语言为例,需要的朋友可以参考下
    2014-07-07
  • 利用python获取当前日期前后N天或N月日期的方法示例

    利用python获取当前日期前后N天或N月日期的方法示例

    最近在工作中遇到一个需求,查找资料发现了一个很好的时间组件,所以下面这篇文章主要给大家介绍了关于利用python获取当前日期前后N天或N月日期的方法示例,需要的朋友们可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • python3实现指定目录下文件sha256及文件大小统计

    python3实现指定目录下文件sha256及文件大小统计

    这篇文章主要为大家详细介绍了python3实现指定目录下文件sha256及文件大小统计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02

最新评论