python多线程
首先需要明确的是:多线程模式下,同时仍然仅有一个计算任务在电脑中运行,只是在当前任务需要进行IO操作时,替换到下一个计算任务到线程上进行计算,唯一节省的时间仅仅只是IO操作时间
1. 创建一个线程
import threading
def job(data):
pass
add_thread = threading.Thread(target = job, args=(data,), name='thread' )
add_thread.start()
target
: 用于指定创建的线程的目标函数,在多线程中,每个线程的任务必须打包成一个功能。args
: 给线程指定的函数传入参数,参数值一定是一个元组类型数据name
: 用于定义线程的名称- 线程创建后,要使用
start()
方法启动该线程
**2. job():**区分多线程和主线程
import threading
def job(data):
pass
add_thread = threading.Thread(target = job, args=(data,), name='thread' )
add_thread.start()
add_thread.join() # 当且仅当多线程运行完毕后,才会继续执行后续主线程任务
print("final")
join():
方法将多线程与主线程进行分割,可以让python项目在处理完需要使用多线程处理的作业后再回复到主线程
3. Queue(): 保存多线程制定函数的计算结果
-
由于多线程指定的函数计算到的最终结果,不能想普通函数一样通过return方法直接返回,所以要借助Queue()实现计算结果的保存和读取
from queue import Queue def job(data, q): # 一系列处理 q.put(data) q = Queue() # 定义一个q实例 # q传入线程中 add_thread = threading.Thread(target=job, args=(data, q), name='thread') add_thread.start() add_thread.join() # 一定要保证线程结束,确保put方法完成 print(q.get()) # 使用get方法读取数据
q=Queue()
:定义了一个用于保存数据的Queue()实例,该实例要作为参数传入要多线程执行的功能函数中- 在函数中使用
put()
方法保存处理好的数据,**一次只能传入一个数据,**多个数据可以使用列表、字典、元组等形式储存 get():
方法用于从队列中取出数据,一次只取一个数据
-
Queue更倾向于一次只保存一个线程的数据结果,但同样支持同时传入多个线程中保存多个数据,但是由于线程的随机性,往往很难区分哪个数据是由哪个线程传入的,可以设置线程名用来描述和区分
from queue import Queue def job(data, q, ID): # 一系列处理 q.put({ID:data}) # 保存数据时,记录数据来自的线程ID q = Queue() # 定义一个q实例 # q传入线程中 add_thread = threading.Thread(target=job, args=(data, q, "add_thread"), name='thread') add1_thread = threading.Thread(target=job, args=(data, q, "add_thread1"), name='thread') add_thread.start() add1_thread.start() add_thread.join() # 一定要保证线程结束,确保put方法完成 add1_thread.join() # 一定要保证线程结束,确保put方法完成