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 返回的值。

以下是上述代码的输出:

总结

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

相关文章

  • 一文详细NumPy中np.zeros的使用

    一文详细NumPy中np.zeros的使用

    np.zeros是NumPy库中一个非常实用的函数,用于快速创建指定形状和大小的全零数组,本文主要介绍了NumPy中np.zeros的使用,感兴趣的可以了解一下
    2024-03-03
  • 详解基于python的全局与局部序列比对的实现(DNA)

    详解基于python的全局与局部序列比对的实现(DNA)

    这篇文章主要介绍了详解基于python的全局与局部序列比对的实现(DNA).文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能

    这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归、确保参数传递的正确,需要的朋友可以参考下
    2015-03-03
  • python pyautogui手动活动(模拟鼠标键盘)自动化库使用

    python pyautogui手动活动(模拟鼠标键盘)自动化库使用

    这篇文章主要为大家介绍了python pyautogui手动活动(模拟鼠标键盘)自动化库使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python设计模式之享元模式原理与用法实例分析

    Python设计模式之享元模式原理与用法实例分析

    这篇文章主要介绍了Python设计模式之享元模式原理与用法,结合实例形式较为详细的分析了享元模式的相关概念、原理、定义及使用方法,需要的朋友可以参考下
    2019-01-01
  • 基于wxpython实现的windows GUI程序实例

    基于wxpython实现的windows GUI程序实例

    这篇文章主要介绍了基于wxpython实现的windows GUI程序,实例分析了windows GUI程序的相关实现技巧,需要的朋友可以参考下
    2015-05-05
  • Python中pre-commit的具体使用

    Python中pre-commit的具体使用

    pre-commit是Git预提交钩子框架,通过配置文件自动执行代码检查、格式化等任务,确保团队代码规范并提升质量,下面就一起来了解一下
    2025-06-06
  • 深度学习的MNIST手写数字数据集识别方式(准确率99%,附代码)

    深度学习的MNIST手写数字数据集识别方式(准确率99%,附代码)

    这篇文章主要介绍了深度学习的MNIST手写数字数据集识别方式(准确率99%,附代码),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 详解Python中的PyInputPlus模块

    详解Python中的PyInputPlus模块

    这篇文章主要介绍了Python中的PyInputPlus模块详解,PyInputPlus包含与input()类似的、用户多种数据(数字日期、E-mail地址等)的函数,PyInputPlus还包含其他有用的功能,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Python递归调用实现数字累加的代码

    Python递归调用实现数字累加的代码

    今天小编就为大家分享一篇Python递归调用实现数字累加的代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02

最新评论