当前位置: 首页 > 后端技术 > Python

Python获取线程返回值的三种方式_0

时间:2023-03-26 10:53:03 Python

说到线程,大家的大脑应该会有这样的印象,我们可以控制它什么时候开始,但是我们无法控制它什么时候结束,那么如何获取线程的返回值?今天我将分享一些我的做法。方法一:使用一个全局变量列表来保存返回值ret_values=[]defthread_func(*args):...value=...ret_values.append(value)选择列表的一个原因是:append列表方法的()是线程安全的,在CPython中,GIL阻止对它们的并发访问。如果使用自定义数据结构,需要在并发修改数据的地方加线程锁。如果事先知道有多少线程,可以定义一个定长列表,然后根据索引存储返回值,例如:fromthreadingimportThreadthreads=[None]*10results=[None]*10deffoo(bar,result,index):result[index]=f"foo-{index}"foriinrange(len(threads)):threads[i]=Thread(target=foo,args=('world!',results,i))threads[i].start()foriinrange(len(threads)):threads[i].join()print("".join(results))方法二:重写joinThread的方法并返回线程函数返回值默认的thread.join()方法只是等待线程函数结束,没有返回值。我们可以在这里返回函数的运行结果。代码如下:fromthreadingimportThreaddeffoo(arg):returnargclassThreadWithReturnValue(Thread):defrun(self):ifself._targetisnotNone:self._return=self._target(*self._args,**self._kwargs)defjoin(self):urrsuper().joinurntwselfret=ThreadWithReturnValue(target=foo,args=("helloworld",))twrv.start()print(twrv.join())#helloworld将在这里打印。这样,当我们调用thread.join()等待线程结束时,我们也得到了线程的返回值。方法三:使用标准库concurrent.futures我觉得前两种方法太底层了。Python的标准库concurrent.futures提供了更高级的线程操作,可以直接获取线程的返回值,相当优雅。代码如下:importconcurrent.futuresdeffoo(bar):returnbarwithconcurrent.futures.ThreadPoolExecutor(max_workers=10)asexecutor:to_do=[]foriinrange(10):#模拟多个任务future=executor.submit(foo,f"helloworld!{i}")to_do.append(future)forfutureinconcurrent.futures.as_completed(to_do):#并发执行print(future.result())某次操作的结果为如下:世界您好!8你好世界!3你好世界!5你好世界!2你好世界!9你好世界!7你好世界!4你好世界!0你好世界!1你好世界!,每日干货分享,发送“J”还可以领取海量学习资料,涵盖Python电子书、教程、数据库编程、Django、爬虫、云计算等。或者去编程学习网了解更多编程技术知识。