哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮
有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。
一、 前言
1. 什么是线程
线程(Thread)也被称为轻量级进程,是操作系统能够进行调度的最小单位,它被包含在进行中,是进程中的实际运作单位。线程本身不拥有系统资源,但是与同进程中的其他线程共享进程资源。
一个进程中的多个线程可以创建和kill另一个线程,同一个进程中的多个线程之间可以并发执行。
2. 进程与线程
进程是资源分配的最小单位,一个程序至少有一个进程。
线程称程序执行的最小单位,一个进程至少有一个线程。
进程都有自己的独立地址空间、内存、数据栈等,所以进程占用资源多。由于进程的资源独立,通信不方便,故而进程间使用IPC通讯。
一个进程中可以存在多个线程,在单核CPU中每隔进程中同时只能运行一个线程,所以只有在多核CPU中在能实现多线程并发。
3. 为什么要用多线程
线程在程序中是独立,并且并发的执行流。与进程相比,进程中线程之间的隔离程度要小,其可以共享内存、文件句柄等。
线程的划分尺度小于进程,使得多线程的并发性要高。而进程在执行的过程中,系统会为其分配独立的内存单元,而线程内存共享,故而效率极大地得到了提升。
线程
二、 Python 多线程
1. 线程间等待 join
from time import sleep
from threading import Thread
import threading
# 小明要下载10个视频
tasks = ['move1','movie2','movie3','movie4','movie5','movie6']
def download(movie):
# print(f'开始下载{movie}')
sleep(2)
print(f'完成下载{movie}')
threads = []
for task in tasks:
t = Thread(target=download, name=task,args=(task,))
t.start() # 启动线程
threads.append(t)
for t in threads:
t.join() # 当前线程等待线程 t 执行完成后再执行后面的代码
print(threading.current_thread())
print('完成')
2. 其他
from time import sleep
from threading import Thread
import threading
# 小明要下载10个视频
tasks = ['move1','movie2','movie3','movie4','movie5','movie6']
def download(movie):
# print(f'开始下载{movie}')
sleep(2)
# print(f'完成下载{movie}')
for task in tasks:
# 创建线程
# daemon :守护线程---当主线程执行完成后,马上终止当前的任务,不管是否完成。
t = Thread(target=download, name=task,args=(task,))
t.start() # 启动线程
print(f'{t.name},{t.ident},{t.is_alive()},{t.daemon}')
print(threading.current_thread())
print('完成')
3. 完整
import threading
import time
from queue import Queue
def job(l,q):
for i in range (len(l)):
l[i] = l[i]**2
q.put(l)
def multithreading():
q =Queue()
threads = []
data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]]
for i in range(4):
t = threading.Thread(target=job,args=(data[i],q))
t.start()
threads.append(t)
for thread in threads:
thread.join()
results = []
for _ in range(4):
results.append(q.get())
print(results)
if __name__=='__main__':
multithreading()
4. 需求:主线程跑的时候,再开启个子线程,无需子线程的结果,相互独立
import threading, time
def T1():
time.sleep(3)
print(666)
def main():
# 添加线程
thread = threading.Thread(target=T1, name='T1')
thread.start()
print(123)
return '6'
if __name__ == '__main__':
main()
参考:
https://blog.csdn.net/qq_16481211/article/details/80950979