python 线程返回结果,python多线程获取函数返回值
说到线程,你的大脑应该有这样的印象:我们可以控制它何时开始,却无法控制它何时结束。那么我们如何获得线程的返回值呢?今天给大家分享一些做法。
00-1010方法1,方法2,方法3。当最后一句话提到线程的时候,你的大脑应该会有这样的印象:我们可以控制它何时开始,但我们无法控制它何时结束。那么我们如何获得线程的返回值呢?今天我就来分享一下我自己的一些做法。
目录
使用全局变量列表来保存返回值。
ret_values=[]
defthread_func(*args):
.
值=.
ret_values.append(值)
选择列表的一个原因是列表的append()方法是线程安全的,在CPython中,GIL阻止对它们的并发访问。如果您使用自定义数据结构,您需要在并发修改数据的地方添加线程锁。
如果你事先知道有多少个线程,你可以定义一个固定长度的列表,然后根据索引存储返回值,比如:
fromthreadingimportThread
线程=[无]*10
结果=[无]*10
deffoo(条形,结果,指数):
结果[索引]=ffoo-{index}
foriinrange(长度(线程)):
threads[i]=Thread(target=foo,args=(world!结果,我))
线程[i]。开始()
foriinrange(长度(线程)):
线程[i]。加入()
打印()。加入(结果))
方法一
重写thread的join方法,返回Thread函数的返回值。
的默认thread.join()方法只是等待线程函数结束,没有返回值。我们可以在这里用下面的代码返回函数的运行结果:
fromthreadingimportThread
deffoo(arg):
returnarg
class threadwithreturnvalue(Thread):
defrun(self):
如果自己。_targetisnotNone:
自我。_return=self。_目标(*自我。_args,**self。_kwargs)
defjoin(self):
超级()。加入()
回归自我。_返回
twrv=ThreadWithReturnValue(target=foo,args=(helloworld ,))
twrv.start()
Print(twrv.join())# hello world将在此打印。
这样,当我们调用thread.join()等待线程结束时,我们也得到了线程的返回值。
方法二
使用标准库concurrent.futures
我觉得前两种方法太低级了。Python的标准库concurrent.futures提供了更高级的线程操作,可以直接得到线程的返回值。相当优雅,代码如下:
importconcurrent.futures
deffoo(bar):
返回栏
withconcurrent . futures . threadpoolexecutor(max _ workers=10)as executor :
to_do=[]
for range(10): #模拟多项任务
future=executor.submit(foo,fhelloworld!{i} )
to_do.append(未来)
forfutureinconcurrent . futures . as _ completed(to _ do): #并发执行
print(future.result())
某次运行的结果如下:
helloworld!八
helloworld!三
helloworld!五
helloworld!2
helloworld!九
helloworld!七
helloworld!四
helloworld!0
helloworld!一个
helloworld!六
方法三
本文分享三种获取线程返回值的方法,推荐第三种方法。
关于Python获得线程返回值的三种方式,本文到此结束。关于Python获取线程返回值的更多信息,请搜索热门IT软件开发工作室之前的文章或者继续浏览下面的相关文章。希望大家以后多多支持热门IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。