多线程何如获取返回值
发布时间:2020-12-15 05:28:11 所属栏目:Java 来源:网络整理
导读:设定一个场景,在用户了添加多个任务,点击run task按钮在后台处理这些tasks,并判断task成功或失败,因为task是耗时的,所以采用多线程方式处理tasks 考虑: 线程启动后如何获取task执行结果? 看代码: import threading import time class TaskThread(thread
设定一个场景,在用户了添加多个任务,点击run task按钮在后台处理这些tasks,并判断task成功或失败,因为task是耗时的,所以采用多线程方式处理tasks 考虑: 线程启动后如何获取task执行结果? 看代码:
import threading import time class TaskThread(threading.Thread): """ 处理task相关的线程类 """ def __init__(self,func,args=()): super(TaskThread,self).__init__() self.func = func # 要执行的task类型 self.args = args # 要传入的参数 def run(self): # 线程类实例调用start()方法将执行run()方法,这里定义具体要做的异步任务 print("start func {}".format(self.func.__name__)) # 打印task名字 用方法名.__name__ self.result = self.func(*self.args) # 将任务执行结果赋值给self.result变量 def get_result(self): # 改方法返回task函数的执行结果,方法名不是非要get_result try: return self.result except Exception as ex: print(ex) return "ERROR" def task_type1(task_id,task_name): print("start tasks,name:{},id:{}".format(task_name,task_id)) time.sleep(2) print("end tasks,task_id)) return task_id thread_pool = [] # 列表用来保存线程实例 for i in range(10): # 循环创建线程对象 thread = TaskThread(task_type1,args=(i + 1,‘pay‘)) # 将线程对象添加到pool thread_pool.append(thread) # 起动线程 执行tasks thread.start() for thread in thread_pool: # 重要的一步,为什么一定要join thread.join() # 从线程pool中获取结果 print("result:{}".format(thread.get_result())) ? ? 运行结果:
start func task_type1 start tasks,name:pay,id:1 start func task_type1 start tasks,id:2 start func task_type1 start tasks,id:3 start func task_type1 start tasks,id:4 start func task_type1 start tasks,id:5 start func task_type1 start tasks,id:6 start func task_type1 start tasks,id:7 start func task_type1 start tasks,id:8 start func task_type1 start tasks,id:9 start func task_type1 start tasks,id:10 end tasks,id:4 end tasks,id:2 end tasks,id:1 end tasks,id:5 end tasks,id:8 end tasks,id:3 result:1 result:2 end tasks,id:9 result:3 result:4 result:5 end tasks,id:6 result:6 end tasks,id:7 result:7 result:8 result:9 result:10 ? 上面代码实现了创建线程执行task,并获取任务,关键点在于线程类中实现了ge_result方法,用来获取任务函数的返回值,并且用到了thread.join(),这是必须的,如果没有thread.join()将会怎么样呢? 注释掉:thread.join() 并重新运行代码:
start func task_type1 start tasks,id:10 ‘TaskThread‘ object has no attribute ‘result‘ result:ERROR ‘TaskThread‘ object has no attribute ‘result‘ result:ERROR ‘TaskThread‘ object has no attribute ‘result‘ result:ERROR ‘TaskThread‘ object has no attribute ‘result‘ result:ERROR ‘TaskThread‘ object has no attribute ‘result‘ result:ERROR ‘TaskThread‘ object has no attribute ‘result‘ result:ERROR ‘TaskThread‘ object has no attribute ‘result‘ result:ERROR ‘TaskThread‘ object has no attribute ‘result‘ result:ERROR ‘TaskThread‘ object has no attribute ‘result‘ result:ERROR ‘TaskThread‘ object has no attribute ‘result‘ result:ERROR end tasks,id:3 end tasks,id:6 end tasks,id:7 end tasks,id:9 end tasks,id:10
start func task_type1 start tasks,id:10 result:1 result:2 result:3 result:4 result:5 result:6 result:7 result:8 result:9 result:10 结果是拿到了,但是每次start()之后join,则子线程阻塞,知道执行结束才开始下一次循环,这样的执行效率等同于单线程循环,如果一个线程任务执行2秒,那这样的方式执行10个任务就要20s,显然是错误的用法,因为join()的作用是:?线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程在终止 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |