Python多任务和线程
多任务
-
概念:同一时间,多个任务同时执行
-
优势:时间短,效率高
-
表现:在
Windows
系统中可以同时多个窗口运行多个任务。Python
默认为单任务运行。
线程的基本使用
概念
可简单理解为是程序执行的一条分支,也是程序执行流程的最小单元。线程是被系统独立调用和分派的基本单位,线程自己并不拥有系统资源,只拥有一点在运行中必不可少的资源,但他可以同属一个进程的其他线程共享进程所拥有的全部资源。
-
主线程:
当一个程序启动时,就有一个进程被系统创建,与此同时一个线程也会被运行,该线程通常叫做程序主线程,也就是说,程序启动就会创建一个主线程。
主线程的重要性有两方面:
-
产生其他子线程的线程;
-
通常它必须最后完成执行。
-
-
子线程:
可以看做是程序执行的一条分支,当子线程启动后会和主线程一起同时执行。
使用threading模块子线程创建
-
步骤:
-
导入模块
threading
-
使用
threading.Thread()
创建对象(子线程对象) -
指定子线程执行的分支
-
启动子线程,
线程对象.start()
-
-
案例:
import time
#导入模块 `threading`
import threading
# 单线程的使用:
def nihao():
print('hello,World')
time.sleep(1)
if __name__ == '__main__':
# 单线程调用
time1 = time.time()
for _ in range(5):
nihao()
time2 = time.time()
print(time2 - time1)
print('--------------------------------')
# 子线程调用:
time3 = time.time()
for _ in range(5):
# 使用`threading.Thread()`创建对象(子线程对象)
# 指定子线程执行的分支
thread_obj = threading.Thread(target=nihao)
# 启动子线程,`线程对象.start()`
thread_obj.start()
time4 = time.time()
print(time4 - time3)
线程名称和数量
查看线程数量
threading.enumerate()
:获取当前所有活跃的线程对象列表。使用len()
对列表求长度可以看到当前活跃的线程的个数。
查看线程名称
threading.current_thread()
:获取当前线程对象,对象中含有名称。
案例
import time
import threading
def nihao():
#`threading.current_thread()`:获取当前线程对象,对象中含有名称
print('hello,World', threading.current_thread())
time.sleep(1)
if __name__ == '__main__':
thread_num = len(threading.enumerate())
#现在只有主线程
print(f'当前线程数量为:{
thread_num}', threading.current_thread())
for _ in range(5):
thread_obj = threading.Thread(target=nihao)
thread_obj.start()
#`threading.enumerate()`:获取当前所有活跃的线程对象列表。
thread_num1 = len(threading.enumerate())
print(f'当前线程数量为:{
thread_num1}')
线程参数和顺序
参数
在线程中传递参数有三种方法:
- 使用元组传递:
threading.Thread(target=函数名称,args=(参数1,参数2,...,参数n))
- 使用字典传递:
threading.Thread(target=函数名称,kwargs={参数名称:参数值,参数名称:参数值,参数名称:参数值,...})
- 混合使用元组和字典:
threading.Thread(target=函数名称,args=(参数1,参数2,...,参数n),kwargs={参数名称:参数值,参数名称:参数值,参数名称:参数值,...})
案例:
import time
import threading
def say(name1, name2, words):
for _ in range(5):
print(f'{
name1}对{
name2}说{
words}')
time.sleep(1)
if __name__ ==