多线程
1.线程的介绍
1.1实现多任务的另一种形式
1.2为什么使用多线程
1.3多线程的作用
2.多线程执行多任务
2.1线程的创建步骤
2.2 通多线程类创建线程对象
2.3 线程创建于启动的代码
示例:
import time
import threading
# 唱歌
def sing():
for i in range(3):
print("唱歌....")
time.sleep(0.5)
def dance():
for i in range(3):
print("跳舞....")
time.sleep(0.5)
if __name__ == '__main__':
sing_thread = threading.Thread(target= sing)
dance_thread = threading.Thread(target= dance)
sing_thread.start()
dance_thread.start()
"G:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python.exe" G:/PythonCode/Multipleprocesses_Learn/多线程多任务.py
唱歌....
跳舞....
唱歌....
跳舞....
唱歌....
跳舞....
Process finished with exit code 0
3.线程执行带有参数的任务
3.1线程执行带有参数的任务
3.2 args参数的使用
3.3 kwargs参数的使用
示例:
import time
import threading
# 唱歌
def sing(num,name):
for i in range(num):
print(name,"唱歌....")
time.sleep(0.5)
def dance(num,name):
for i in range(num):
print(name,"跳舞....")
time.sleep(0.5)
if __name__ == '__main__':
sing_thread = threading.Thread(target= sing,args=(3,"ttt"))
dance_thread = threading.Thread(target= dance,kwargs={"num":3,"name":"ggg"})
sing_thread.start()
dance_thread.start()
"G:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python.exe" G:/PythonCode/Multipleprocesses_Learn/带参数的多线程.py
ttt 唱歌....
ggg 跳舞....
ggg 跳舞....
ttt 唱歌....
ttt 唱歌....
ggg 跳舞....
Process finished with exit code 0
4.主线程和子线程的结束顺序
示例:
import time
import threading
def work():
for i in range(10):
#共延时2s
print("work ...")
time.sleep(0.2)
if __name__ == '__main__':
work_process = threading.Thread(target= work) #子线程执行两秒
work_process.start()
time.sleep(1) #主线程执行一秒
print("主进程完成")
"G:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python.exe" G:/PythonCode/Multipleprocesses_Learn/主线程与子线程的执行顺序.py
work ...
work ...
work ...
work ...
work ...
主进程完成
work ...
work ...
work ...
work ...
work ...
Process finished with exit code 0
4.1 设置守护主线程
示例:
import time
import threading
def work():
for i in range(10):
#共延时2s
print("work ...")
time.sleep(0.2)
if __name__ == '__main__':
#设置守护主线程
#方法1
# work_process = threading.Thread(target= work,daemon= True)
# work_process.start()
#方法2 与方法1效果相同
work_process = threading.Thread(target= work)
work_process.setDaemon(True)
work_process.start()
time.sleep(1) #主线程执行一秒
print("主进程完成")
"G:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python.exe" G:/PythonCode/Multipleprocesses_Learn/主线程与子线程的执行顺序.py
work ...
work ...
work ...
work ...
work ...
主进程完成
Process finished with exit code 0
5.线程间的执行顺序
5.1线程之间的执行是无序的
5.2 获取当前的线程信息
import threading
import time
def task():
time.sleep(1)
thread = threading.current_thread()
print(thread)
if __name__ =='__main__':
for i in range(5):
sub_thread = threading.Thread(target= task)
sub_thread.start()
"G:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python.exe" G:/PythonCode/Multipleprocesses_Learn/线程间执行的顺序.py
<Thread(Thread-3, started 15020)>
<Thread(Thread-2, started 11748)>
<Thread(Thread-1, started 5272)>
<Thread(Thread-4, started 22076)>
<Thread(Thread-5, started 17036)>
Process finished with exit code 0
6.进程与线程的对比
6.1 关系对比
6.2 区别对比
6.3 优缺点对比
7.多线程实现文件夹高并发Copy器
示例:
import os
import threading
def Copy(filename ,source_dir,dest_dir):
source_path = source_dir + "/"+filename
dest_path = dest_dir + "/" + filename
with open(source_path,'rb') as source_file:
with open(dest_path,'wb') as dest_file:
while True:
data = source_file.read()
if data:
dest_file.write(data)
else:
break
if __name__ == "__main__":
source_dir = "."
dest_dir = "../CCCCCC"
# dest_dir = "G:/PythonCode/ccc"
try:
os.mkdir(dest_dir)
except:
print("目标文件夹已存在")
file_list = os.listdir(source_dir)
for file_name in file_list:
sub_thread = threading.Thread(target=Copy,args=(file_name,source_dir,dest_dir))
sub_thread.start()