资讯专栏INFORMATION COLUMN

Python获取线程返回值的三种方式分别是什么?下文给大家解答

89542767 / 501人阅读

  小编写这篇文字的一个主要目的,主要是给大家解答关于python的一些相关事宜,主要涉及到内容是如何利用其python获取返回值,那么,返回值的三种方式分别是什么呢?具体的内容,下面就给大家详细的做出解答。


  提到线程,你的大脑应该有这样的印象:我们可以控制它何时开始,却无法控制它何时结束,那么如何获取线程的返回值呢?今天就分享一下自己的一些做法。


  方法一


  使用全局变量的列表,来保存返回值


  ret_values=[]
  def thread_func(*args):
  ...
  value=...
  ret_values.append(value)


  选择列表的一个原因是:列表的append()方法是线程安全的,CPython中,GIL防止对它们的并发访问。如果你使用自定义的数据结构,在并发修改数据的地方需要加线程锁。


  如果事先知道有多少个线程,可以定义一个固定长度的列表,然后根据索引来存放返回值,比如:


  from threading import Thread
  threads=[None]*10
  results=[None]*10
  def foo(bar,result,index):
  result[index]=f"foo-{index}"
  for i in range(len(threads)):
  threads<i>=Thread(target=foo,args=('world!',results,i))
  threads<i>.start()
  for i in range(len(threads)):
  threads<i>.join()
  print("".join(results))


  方法二


  重写Thread的join方法,返回线程函数的返回值


  默认的thread.join()方法只是等待线程函数结束,没有返回值,我们可以在此处返回函数的运行结果,代码如下:


  from threading import Thread
  def foo(arg):
  return arg
  class ThreadWithReturnValue(Thread):
  def run(self):
  if self._target is not None:
  self._return=self._target(*self._args,**self._kwargs)
  def join(self):
  super().join()
  return self._return
  twrv=ThreadWithReturnValue(target=foo,args=("hello world",))
  twrv.start()
  print(twrv.join())#此处会打印hello world。


  这样当我们调用thread.join()等待线程结束的时候,也就得到了线程的返回值。


  方法三


  使用标准库concurrent.futures


  我觉得前两种方式实在太低级了,Python的标准库concurrent.futures提供更高级的线程操作,可以直接获取线程的返回值,相当优雅,代码如下:


  import concurrent.futures
  def foo(bar):
  return bar
  with concurrent.futures.ThreadPoolExecutor(max_workers=10)as executor:
  to_do=[]
  for i in range(10):#模拟多个任务
  future=executor.submit(foo,f"hello world!{i}")
  to_do.append(future)
  for future in concurrent.futures.as_completed(to_do):#并发执行
  print(future.result())


  某次运行的结果如下:


  hello world!8


  hello world!3


  hello world!5


  hello world!2


  hello world!9


  hello world!7


  hello world!4


  hello world!0


  hello world!1


  hello world!6


  最后的话


  本文分享了获取线程返回值的3种方法,推荐使用第三种


  综上所述,这篇文章就给大家介绍到这里了,希望可以给大家带来更多帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128309.html

相关文章

  • Python三种主要模块介绍

      Python的三种主要模块介绍  小编写这篇文章的主要目的,给大家介绍三种主要的模块,包括系统内的几种模块,对其做个具体的介绍,下面就给大家详细的解答下。  在python中,一个文件(以.py为后缀名的文件)就叫做一个模块,每一个模块在python里都被看做是一个独立的文件。  模块可以被项目中的其他模块、一些脚本甚至是交互式的解析器所使用,它可以被其他程序引用,从而使用该模块里的函数等功能...

    89542767 评论0 收藏0
  • 如何利用python读取excel表格?下文大家详细解答

      小编写这篇文章的一个主要目的,主要就是给大家去做一个解答,接的内容主要是利用python去读取excel表格,那么,怎么才能快速的实现这个操作呢?下面就给大家详细解答下。  一、python读取excel表格数据  1、读取excel表格数据常用操作  importxlrd   #打开excel表格   data_excel=xlrd.open_workbook('data/datas...

    89542767 评论0 收藏0
  • Python基础知识解答:字典详细使用教程

      字典作为python中一个内置的数据机构,它其实和列表是一样的,但是它又是没有顺序的,以键值的方式,用来存储数据,那么,它的使用教程是什么呢?下文给大家做个解答。  一.什么是字典  字典作为Python的一个内置数据结构,和列表一样都是可变序列的,但是它是无序的,以键值对的方式存储数据。  二.创建字典  创建字典的两种方式,一种使用{}另一种使用内置函数dict() #author:爪哇斗...

    89542767 评论0 收藏0
  • Python标准库sys库常用功能相关解答

      小编写这篇文章的主要目的,就是给大家介绍关于Python标准库sys常用功能的一些介绍,这样对我们以后的工作也是很有帮助的,具体的介绍,下面就给大家详细解答下。  1、查看版本信息  #coding:utf-8   importsys   #获取Python版本信息   print(sys.version)   #获取解释器中C的API版本   print(sys.api_version)  ...

    89542767 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<