【笔记】Python多线程之Threading使用

本文介绍了如何在Python中使用Threading库进行多线程任务处理,并自定义框架获取每个线程的返回值。作者通过MyThreading类实现了任务添加、启动和结果收集的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【笔记】Python多线程之Threading使用

记录在python中使用多线程同步处理某个任务,并返回结果;

主体方法
t = threading.Thread(target=fun, args=(ii,))

注意,fun只能是函数名,不能带括号,带括号的直接运行该函数了

#  启动线程
for t in mission:
    t.start()
# 等待线程完成, 直至启动的线程终止之前,一直挂起,
for t in mission:
    t.join()

首先全部启动,然后join主进程,在进程结束之前,主进程不会终止;

自定框架

首先,我想要获取所有任务的返回值,而Threading库没有显示的方法来返回线程函数的返回值;

所以,自定义了一个框架,将先线程函数再包一层,然后,通过类的成员变量来获取每一个线程函数的返回值;

框架定义如下:

# coding:utf-8
"""
@author: Finks
@time: 2020/12/22 16:02

"""
import threading
import time


class MyThreading():
    def __init__(self):

        self.mission_dict = {}  # idx为键,{}值, 值{‘fun’: 不带括号函数名, ‘args':参数列表, ()给出}
        self.ret_dict = {}  # 返回结果字典,使用索引idx确定任务

        pass

    def trace_fun(self, idx, fun, args):
        """
        添加监控函数,将任务函数包在里面,目的是为了获取返回值
        :param kwargs:
        :return:
        """
        ret = fun(**args)
        self.ret_dict[idx] = ret

    def main(self):
        """
        多线程调用
        :return:
        """
        thread_list = []
        for mission in self.mission_dict.items():
            t = threading.Thread(target=self.trace_fun, args=(mission[0], mission[1]['fun'], mission[1]['args'],))
            thread_list.append(t)

        #  启动线程
        for t in thread_list:
            t.start()

        # 等待线程完成, 直至启动的线程终止之前,一直挂起,
        for t in thread_list:
            t.join()

        return self.ret_dict


def do(string, num):
    print(time.ctime(), '调用do函数, 参数为{}-{}'.format(string, num))
    t0 = time.time()
    time.sleep(num)
    print('参数为{}-{}调用完成, 耗时{}'.format(string, num, time.time() - t0))
    return num


if __name__ == '__main__':

    t0 = time.time()

    my_threading = MyThreading()

    # todo: 添加你的任务
    for i in range(5):
        my_threading.mission_dict[i] = {'fun': do, 'args': {'string': 'a', 'num': i}} # fun只能写函数名,不能带括号

    my_threading.main()
    print(my_threading.ret_dict)
    print("主线程耗时",time.time()-t0)

调用的时候使用该框架,进行多线程调用!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值