多线程&多进程
1,什么是进程
-
一个正在运行的应用就是一个进程
-
每一个进程均运行在其专用的且受保护的内存(运行内存)中
2,线程
2.1什么是线程
- 线程定义
线程是进程执行任务的基本单元
进程要做什么事,干什么活都必须要有线程
- 线程的特点 - 串行
要在一个线程中执行多个任务,任务串行执行(一个一个执行)
- 多线程
默认情况下一个进程只有一个线程,多线程指一个进程中有多个线程
多线程执行不同任务可以并行(同时)执行
(* ̄(oo) ̄):多线程可以提高程序执行效率,但并不是越多越好。计算机一般应用程序不超过100个,爬虫200-300个。
- 主线程、子线程
一个进程默认一个线程,该线程就是主线程。主线程外的线程都是子线程。
如果进程中需要子线程,只能自己创建(创建线程类,或者线程类的子类对象)
创建线程对象需要导入
from threading import Thread
2.2创建子线程
①创建线程对象,分配线程任务
t = Thread(*, target = 在线程中调用的函数, args)
target ---- 需要在子线程中调用函数,需要给一个普通函数的函数名
args ---- 在子线程中调用target对应的函数的时候,需要的参数对应的元组,如果需要一个实参,元组就给一个元素,以此类推
②启动线程:线程对线.start()
def download(name):
print(f"{name}开始下载:{datetime.now()}")
time.sleep(randint(1, 10))
print(f"{name}下载完成:{datetime.now()}")
t1 = Thread(target=download, args=("a",))
t2 = Thread(target=download, args=("b",))
t3 = Thread(target=download, args=("c",))
t1.start()
t2.start()
t3.start()
2.3线程阻塞 - 等到某个线程的任务结束才接着执行
线程对象.join
3,多进程
-
一个应用默认只有一个进程,为主进程
-
一个程序可以有多个进程,主进程外的进程为子进程
-
主进程以外的进程需要自己创建进程对象
def download(name):
print(f"{name}开始下载:{datetime.now()}")
time.sleep(randint(1, 10))
print(f"{name}下载完成:{datetime.now()}")
# 如果想要使用多进程,必须在程序中添加下面的if语句
if __name__ == '__main__':
# 1,创建进程对象
p1 = Process(target=download, args=("aaa",))
p2 = Process(target=download, args=("bbb",))
p3 = Process(target=download, args=("ccc",))
p4 = Process(target=download, args=("ddd",))
p1.start()
p2.start()
p3.start()
p4.start()
(* ̄(oo) ̄):如果想要使用多进程,必须在程序中添加下面的if语句
if __name__ == '__main__':