【笔记】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)
调用的时候使用该框架,进行多线程调用!!