Python多种方法获取多线程返回值

【摘要】

        近段时间,工作上需要用到多线程,并且要获取多线程的返回值,python多线程一般使用threading模块,但threading模块有个问题,无法返回线程里面运行的结果,我通过三种方法讲解如何获取多线程的返回值。

一、通过获取多线程的返回值有如下三种常用方法:

方法一:通过自定义线程类,继承Thread类,并复写run方法,在run方法中写入执行函数的方式,并把返回值赋值给result;然后通过调用get_result获取每个进程的返回值,代码如下:

  1. import threading  
  2. import Queue  
  3.   
  4.   
  5. 判断值是否为偶数  
  6. def is_even(value):  
  7.     if value % 2 == 0:  
  8.         return True  
  9.     else:  
  10.         return False  
  11.   
  12.   
  13. class MyThread(threading.Thread):  
  14.     def __init__(self, func, args=()):  
  15.         super(MyThread, self).__init__()  
  16.         self.func = func  
  17.         self.args = args  
  18.   
  19.     def run(self):  
  20.         self.result = self.func(*self.args)  在执行函数的同时,把结果赋值给result,  
  21.         然后通过get_result函数获取返回的结果  
  22.   
  23.     def get_result(self):  
  24.         try:  
  25.             return self.result  
  26.         except Exception as e:  
  27.             return None  
  28.   
  29. result = []  
  30. threads = []  
  31. for i in range(10):  
  32.     t = MyThread(is_even, args=(i,))  
  33.     t.start()  
  34.     threads.append(t)  
  35. for t in threads:  
  36.     t.join()  一定执行join,等待子进程执行结束,主进程再往下执行  
  37.     result.append(t.get_result())  
  38. print result  

方法二:通过python内置的队列Queue接收子进程的返回值,然后再从中取出,代码如下:

  1. import threading  
  2. import Queue  
  3. def is_even(value, q):  
  4.     if value % 2 == 0:  
  5.         q.put(True)  
  6.     else:  
  7.         q.put(False)  
  8.   
  9.   
  10. def multithreading():  
  11.     q = Queue.Queue()  
  12.     threads = []  
  13.     results = []  
  14.     for i in range(10):  
  15.         t = threading.Thread(target=is_even, args=(i, q))  
  16.         t.start()  
  17.         threads.append(t)  
  18.     for thread in threads:  
  19.         thread.join()  等待子线程结束后,再往后面执行  
  20.     for _ in range(10):  
  21.         results.append(q.get())  
  22.     print(results)  
  23.   
  24. multithreading()  

 

方法三:通过创建线程池(threadpool)的方式获取返回值,由于该模块属于第三方模块,因此需要先进行安装:pip install threadpool,具体执行代码如下:

  1. import threadpool  
  2.   
  3. 判断值是否为偶数  
  4. def is_even(value):  
  5.     if value % 2 == 0:  
  6.         return True  
  7.     else:  
  8.         return False  
  9.   
  10.   
  11. 回调函数,接受的参数(请求本身,和请求工作函数执行结果)可以省略  
  12. results = []  
  13. def get_result(request, result):  
  14.      global results  
  15.      results.append(result)  
  16.   
  17.   
  18. # data 设置为长度为10的列表,(列表中每一个数作为参数传递给工作函数运行一次)  
  19. data = range(10)  
  20. 声明可容纳五个线程的池  
  21. pool = threadpool.ThreadPool(5)  
  22. 创建线程运行内容请求列表(线程工作函数,线程工作参数列表,回调函数)  
  23. requests = threadpool.makeRequests(is_even, data, get_result)  
  24. 将每一个线程请求扔进线程池  
  25. [pool.putRequest(req) for req in requests]  
  26. 等待data被消耗完,所有线程运行结束。  
  27. pool.wait()  
  28. print results  

运行以上例子,返回的结果如下:

  1. C:\Python27\python.exe D:/bluekingProject/wd-test/app-publish/test.py  
  2. [True, False, True, False, True, False, True, False, True, False]  

 

二、总结

      以上就是获取多线程返回值的三种方法,其中方法一和方法二用得比较多,并且第一种方法更灵活。

   

  • 23
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿木木爱打代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值