python 线程返回结果,python多线程获取函数返回值

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: