首页 > 编程语言 >Python3 多线程并发处理的返回值收集

Python3 多线程并发处理的返回值收集

时间:2022-12-08 10:14:11浏览次数:54  
标签:__ return self num Python3 返回值 多线程 def result

库函数

threading

背景

去查询python3多线程,可以找到一大堆关于threading库的博客教程,但是多数是几个线程执行同一个函数(他们博客里各个线程传入的函数参数不同),且没有考虑获取函数的返回值.
我基于现有资料,对threading的应用又进行了以下扩展:

  • 面向对象的继承封装
  • 包含多个线程
  • 包含返回值
  • 包含多个函数
  • 代码结构极其简单

代码1

import threading
import time
from math import sqrt

class Demo(threading.Thread):       # 注意继承关系
    def __init__(self, func, args=()): # 指定函数和参数
        super(Demo, self).__init__()   # 切记别忘了
        self.func = func
        self.args = args

    def run(self):
        self.result = self.func(*self.args)

    def get_result(self):  # 完全自定义一个返回函数, 设置返回值
        try:
            return self.result  # 如果子线程不使用join方法,此处可能会报没有self.result的错误
        except Exception:
            return None

def Add(num):
    time.sleep(1)
    return num+100

def Sub(num):
    time.sleep(1)
    return num-100

def Mul(num):
    time.sleep(1)
    return num*100

def Sqrt(num):
    time.sleep(1)
    return sqrt(abs(num)+1)

def task_run():
    try:

        FuncL = (Add,Sub,Mul,Sqrt)
        ThreadL = []      # 存储各个线程
        ResL = []   # 存储各个线程的返回值
        for i in range(4):
            ThreadL.append(Demo(func=FuncL[i], args=(i,)))
        for _t in ThreadL:
            _t.start()
        for _t in ThreadL:
            _t.join()
            ResL.append(_t.get_result())
        return ResL
    
    except Exception as err:
        print(str(err))
    
if __name__ == '__main__':
    x = task_run()
    print("--------")
    print(x)

执行效果


这里列表的输出有1s的停顿.

原理

背后的原理是在Demo类对象里面完全自定义一个返回函数get_result(), 函数体内设置返回值. task_run()函数的内容可以完全写在main()函数里,效果一样;现在这样写是为了简化main函数逻辑.

可以继续魔改Demo类的内容,修改原来的join()函数,新增一句输出内容.并利用了threading.Thread()自带的name参数.请看如下代码:

代码2

import threading
import time
from math import sqrt

class Demo(threading.Thread):       # 注意继承关系
    def __init__(self, func, name, args=()): # 指定函数和参数
        super(Demo, self).__init__()   # 切记别忘了
        self.func = func
        self.name = name
        self.args = args

    def run(self):
        self.result = self.func(*self.args)

    def get_result(self):
        try:
            return self.result  # 如果子线程不使用join方法,此处可能会报没有self.result的错误
        except Exception:
            return None
    
    def join(self):
        super(Demo, self).join()
        print(f" Thread #{self.name} End! ")

def Add(num):
    time.sleep(1)
    return num+100

def Sub(num):
    time.sleep(1)
    return num-100

def Mul(num):
    time.sleep(1)
    return num*100

def Sqrt(num):
    time.sleep(1)
    return sqrt(abs(num)+1)

def task_run():
    try:

        FuncL = (Add,Sub,Mul,Sqrt)
        ThreadL = []      # 存储各个线程
        ResL = []   # 存储各个线程的返回值
        for i in range(4):
            ThreadL.append(Demo(func=FuncL[i], args=(i,), name=str(i)*5))
        for _t in ThreadL:
            _t.start()
        for _t in ThreadL:
            _t.join()
            ResL.append(_t.get_result())
        return ResL
    
    except Exception as err:
        print(str(err))
    
if __name__ == '__main__':
    x = task_run()
    print("--------")
    print(x)

执行效果

标签:__,return,self,num,Python3,返回值,多线程,def,result
From: https://www.cnblogs.com/Higgerw/p/16965295.html

相关文章

  • Centos 7 + python3 + paramiko + netmiko 安装
    转载自 (31条消息)Centos7下安装Python3并通过Pip安装Paramiko与Netmiko_筐瓢大师小吕的博客-CSDN博客             ......
  • 8 网络&多线程
    HeadFirstJava和AcWingJava课程做的总结8。所有网络运作的低层细节都已经由java.net函数库处理掉了。传送与接收网络上的数据只不过是链接上使用不同的链接串流的输......
  • java面试(多线程)
    1. Callable、Future、FutureTash详解Callable与Future是在JAVA的后续版本中引入进来的,Callable类似于Runnable接口,实现Callable接口的类与实现Runnable的类都是可以被线程......
  • JUC5 多线程锁(下)
    1.​​synchronize​​锁升级:无锁,偏向锁,轻量锁,重量锁(看病:社区医院->三甲医院)1.1 概述按照获得锁和释放锁的性能消耗,锁的分类:1.无锁状态2.偏向锁:不进行​​CAS​​,测......
  • JUC4 多线程锁(上)
    1.乐观锁和悲观锁①.悲观锁什么是悲观锁?认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改适合写操作多的场......
  • 在OpenEuler22.09(也适用于CentOS7+)编译安装Python3.9,并与原Python共存-指南
    指南使用操作系统:OpenEuler22.09(网络安装,最小安装,使用默认源)指南使用系统自带Python版本:3.10(高版本,这不是3.1喔)1.安装基本的编译环境yum-yinstallgccgcc-c++......
  • 多线程--面试题整理
    简述线程,程序、进程的基本概念线程:与进程相似,但线程是比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空......
  • python3cookielib模拟登陆
    Cookie介绍Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。比如说有些网站需要登录后才能访问某个页面,在登录之前,你想......
  • Python3+pygame实现飞机大战游戏(免费完整项目)
    版权声明:原创不易,本文禁止抄袭、转载,侵权必究! 一、开发环境开发环境:Windows10   Python3.6.4第三方库:Pygame1.9.6IDE    :PyCharm/SublimeText ......
  • JAVA 实现多线程发售火车票
    publicclassdemo05{publicstaticvoidmain(String[]args){TicketWindowtw=newTicketWindow();newThread(tw,"窗口1").start();ne......