小编写这篇文字的一个主要目的,主要是给大家解答关于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中,一个文件(以.py为后缀名的文件)就叫做一个模块,每一个模块在python里都被看做是一个独立的文件。 模块可以被项目中的其他模块、一些脚本甚至是交互式的解析器所使用,它可以被其他程序引用,从而使用该模块里的函数等功能...
小编写这篇文章的一个主要目的,主要就是给大家去做一个解答,接的内容主要是利用python去读取excel表格,那么,怎么才能快速的实现这个操作呢?下面就给大家详细解答下。 一、python读取excel表格数据 1、读取excel表格数据常用操作 importxlrd #打开excel表格 data_excel=xlrd.open_workbook('data/datas...
字典作为python中一个内置的数据机构,它其实和列表是一样的,但是它又是没有顺序的,以键值的方式,用来存储数据,那么,它的使用教程是什么呢?下文给大家做个解答。 一.什么是字典 字典作为Python的一个内置数据结构,和列表一样都是可变序列的,但是它是无序的,以键值对的方式存储数据。 二.创建字典 创建字典的两种方式,一种使用{}另一种使用内置函数dict() #author:爪哇斗...
小编写这篇文章的主要目的,就是给大家介绍关于Python标准库sys常用功能的一些介绍,这样对我们以后的工作也是很有帮助的,具体的介绍,下面就给大家详细解答下。 1、查看版本信息 #coding:utf-8 importsys #获取Python版本信息 print(sys.version) #获取解释器中C的API版本 print(sys.api_version) ...
阅读 909·2023-01-14 11:38
阅读 876·2023-01-14 11:04
阅读 739·2023-01-14 10:48
阅读 1979·2023-01-14 10:34
阅读 941·2023-01-14 10:24
阅读 818·2023-01-14 10:18
阅读 498·2023-01-14 10:09
阅读 571·2023-01-14 10:02