多线程和多进程学习总结
一、概念
-
什么是进程
一个正在运行的应用程序就是一个进程
每一个进程均运行在其专用且受保护的内存(运行内容)中
-
什么是线程
线程是进程执行任务的基本单元
线程要做什么事情,或者要干什么必须要有线程
-
线程的特点 —— 串型
如果在一个线程中执行多个任务,任务是串行执行(一个一个的按照顺序)
-
多线程
默认情况下一个进程只有一个线程,多线程指的是在一个进程中有多个线程
多线程执行不同的任务可以并行(同时)执行
注意:多线程可以提高程序执行效率,但不是越多越好(计算机一般的应用程序不要超过100个,爬虫可以到达200到300个)
二、多线程
-
主线程和子线程
一个进程默认只有一个线程,这个线程叫主线程。除了主线程以外的线程都叫子线程
如果进程中需要子线程,只能自己创建(创建线程类或者线程类的子类对象)
from threading import Thread, current_thread
-
单线程的串行
def download(name) : print(f'{name}开始下载:{datetime.now()}') time.sleep(2) print(f'{name}下载结束:{datetime.now()}') download('1') download('2') download('3')
-
创建三个子线程,下载三个文件
-
创建线程对象,并且分配线程任务:Thread(* ,target, args)
target — 需要在子线程中调用的函数,需要给一个普通函数的函数名(代表任务)
args — 在子线程中调用target对应的函数的时候需要的参数对应的元组。如果需要几个实参,元组就给几个元素
t1 = Thread(target=download,args=('1',)) t1 = Thread(target=download,args=('2',)) t1 = Thread(target=download,args=('3',))
-
启动线程:线程对象.start()
t1.start() t2.start() t3.start()
-
-
线程阻塞
-
阻塞线程 —— 等到某个线程的任务结束才接着执行
线程对象.jion()
-
三、多进程
- 多线程
一个应用程序默认只有一个进程(主进程),每一个进程中默认一个线程(主线程)
一个程序可以有多个进程(除了主进程以外的进程叫子进程),任何一个进程中又可以有多个线程
如果需要程序中有子进程,需要自己创建进程对象(创建的进程中都自带一个线程)
from multiprocessing import Process
-
使用多进程
-
创建进程对象
from multiprocessing import Process from datetime import datetime import time def download(name): print(f'{name}开始下载:{datetime.now()}') time.sleep(2) print(f'{name}下载结束:{datetime.now()}') if __name__ == '__main__' : p1 = Process(target=download, args=('1',)) p2 = Process(target=download,args=( '2',)) p3 = Process(target=download, args=('3',))
-
启动进程
p1.start() p2.start() p3.start()
-
阻塞进程
p1.join() p2.join() p3.join() print('下载完成! ')
-