首页 > 编程语言 >python获取threading多线程的return返回值

python获取threading多线程的return返回值

时间:2023-05-31 18:35:01浏览次数:56  
标签:return self threading 线程 返回值 多线程 more

转载:(15条消息) python获取threading多线程的return返回值_python threading 返回值_星火燎愿的博客-CSDN博客

我们正常使用 threading 模块创建的线程是无法获取它所执行方法的返回值的;

如:

w = threading.Thread(target=worker,args=(i,))
一、重写线程,获取线程return返回值
要想获取线程中执行方法return的返回值,就需要重新定义 threading 的类,
也就是常说的 继承、重写;

代码:

# -*- coding: utf-8 -*-
import threading,time
 
"""
用类包装线程;调用时可以获取线程的return返回值
"""
 
# 定义一个MyThread.py线程类
class MyThread(threading.Thread):
    def __init__(self, func, args=()):
        super(MyThread, self).__init__()
        self.func = func
        self.args = args
    def run(self):
        time.sleep(2)
        self.result = self.func(*self.args)
    def get_result(self):
        threading.Thread.join(self)  # 等待线程执行完毕
        try:
            return self.result
        except Exception:
            return None
 
#获取多线程return返回值的测试方法
def admin(number):
    uiu = number
    for i in range(10):
        uiu = uiu+i
    return uiu
 
if __name__ == "__main__":
    #创建四个线程
    more_th1 = MyThread(admin,(5,))
    more_th2 = MyThread(admin,(10,))
    more_th3 = MyThread(admin,(50,))
    more_th4 = MyThread(admin,(78,))
 
    #启动线程
    more_th1.start()
    more_th2.start()
    more_th3.start()
    more_th4.start()
 
    #线程等待(即:等待四个线程都运行完毕,才会执行之后的代码)
    more_th1.join()
    more_th2.join()
    more_th3.join()
    more_th4.join()
 
    #输出线程执行方法后的的返回值
    print(more_th1.get_result())
    print(more_th2.get_result())
    print(more_th3.get_result())
    print(more_th4.get_result())

二、使用线程池,获取return返回值

还有另一种方式获取线程执行方法的return返回值,那就是使用线程池:
代码:

# -*- coding: utf-8 -*-
from concurrent.futures import ThreadPoolExecutor
import threading
import time
 
# 定义获取线程return返回测试的方法
def action_a(max):
    my_sum = max + 1
    return my_sum
 
def action_b(max):
    my_sum = max + 100
    time.sleep(3)
    return my_sum
 
# 创建包含2个线程的线程池
pool = ThreadPoolExecutor(max_workers=2)
# 向线程池提交一个任务, 20和10会作为action_a/b()方法的参数
future1 = pool.submit(action_a, 20)
future2 = pool.submit(action_b, 10)
 
# 判断future1线程是否结束---返回False表示该线程未结束,True表示该线程已经结束
print("future1线程的状态:" + str(future1.done()))       #此时future1线程已结束
# 判断future2线程是否结束
print("future2线程的状态:" + str(future2.done()))        #此时future2线程未结束,因为休眠了3秒
 
# 查看future1代表的任务返回的结果,如果线程未运行完毕,会暂时阻塞,等待线程运行完毕后再执行、输出;
print(future1.result())        #此处会直接输出
# 查看future2代表的任务返回的结果
print(future2.result())        #此处会等待3秒,因为方法中休眠了3秒
 
# 关闭线程池
pool.shutdown()

 

标签:return,self,threading,线程,返回值,多线程,more
From: https://www.cnblogs.com/zhiminyu/p/17447010.html

相关文章

  • 多线程-线程池与java内存模型
    多线程-线程池与java内存模型线程池的使用(思路:什么是线程池->他的基本构造以及参数含义->如何使用,使用过程中需要注意什么->有哪些好用的工具类)线程池的基笨概念:首先看一下的继承关系,其次看他的状态,它是利用int的高三位表示状态,比如111表示能接受任务,具体看下面第二章图......
  • JS大文件分片上传/多线程上传
    ​ 一、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。 二、Range  用于请求头......
  • redis是单线程还是多线程?为什么redis那么快?
    redis是单线程的。官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!Redis为什么单线程还这么快?1、误区1:高性能的服务器一定是多线程的?2、误区2:多线程一定比单线程效率高?多线程需要cpu调......
  • 多线程或监听器@Autowired注入null空指针
    //问题:在多线程中使用@Autowired注入IUserService时,userService使用时为null,获取不到bean//原因:newthread不在spring容器中,也就无法获得spring中的bean对象;@AutowiredprivateIUserServiceuserService;//解决:手动获取bean对象privateIUserServiceuserService=AppCo......
  • Java大文件分片上传/多线程上传功能
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • Java大文件分片上传/多线程上传解决方案
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1.通过form表单向后端发送请求         <formid="postForm"action="${pageContext.request.contextPath}/UploadServlet"method="post"e......
  • 由C# yield return引发的思考
    前言    当我们编写C#代码时,经常需要处理大量的数据集合。在传统的方式中,我们往往需要先将整个数据集合加载到内存中,然后再进行操作。但是如果数据集合非常大,这种方式就会导致内存占用过高,甚至可能导致程序崩溃。    C#中的yieldreturn机制可以帮助我们解决这个问题......
  • 2023-05-30:Redis6.0为什么要引入多线程呢?
    2023-05-30:Redis6.0为什么要引入多线程呢?答案2023-05-30:Redis多线程比单线程性能提升一倍:Redis6.0引入多线程IO特性对性能提升至少是一倍以上。据Redis作者antirez在RedisConf2019分享中介绍,多线程IO特性可以显著提高Redis的性能和吞吐量,实测GET/SET命令在4......
  • 转:多线程详解
    转自:https://juejin.cn/post/71230166680951849331.什么是多线程1.1进程当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。1.2线程线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈......
  • 使用powercli 批量多线程 克隆vsphere虚拟机
    $VMS=import-csv-Path'vm001.csv'$Job=$VMS|ForEach-Object-Parallel{#忽略位$Skip=$($_.skip)if($Skip-eq"yes"){continue}#虚拟机名字$VMname=$($_.name)#资源池名字$Resource_Pool=$($_.res_po......