import threading # 多线程 import multiprocessing # 多进程
进程和线程:
线程:是计算机中可以被cpu调度的最小单元;(真正在工作)
进程:是计算机资源分配的最小单元。(进程为线程提供资源)
一个进程中可以有多个进程,同一个进程中的线程可以共享此进程的资源。
通过 进程 和 线程 都可以将 串行 的程序变为 并发。
Python—requests模块详解 - 小L小 - 博客园
1 多线程import time
import requests
import threading
"""
def func(a1, a2, a3):
pass
t = threading.Thread(target=函数名, args=(11,22,33))
t.start()
"""
url_list = [
("东北F4模仿秀.mp4", "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0300f570000bvbmace0gvch71o53oog"),
("卡特扣篮.mp4", "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f3e0000cv52fpn5t6p007e34qlg")
]
def task(file_name, video_url):
res = requests.get(video_url)
with open(file_name, mode='wb') as f:
f.write(res.content)
print(file_name,time.time())
for name, url in url_list:
t = threading.Thread(target=task, args=(name, url))
t.start()
线程创建:
1 首先导入 threading 这个模块
2 创建一个线程 t = threading.Thread(target=函数名, args=(11,22,33)) 如果这个函数需要传 入参数,需要加上后面的args=(11,22,33)
args=(11,22,33) 意味着 函数 def func(a1, a2, a3): 有三个参数
def func(a1, a2, a3):
pass
3 此时只是创建了线程t, 线程还没有开始工作, 这时可以利用start()执行
t.start()
2 多进程
import time
import requests
import multiprocessing
"""
def func(a1, a2, a3):
pass
# 进程创建之后,在进程中还会创建一个线程
t = multiprocessing.Process(target=函数名, args=(11,22,33))
t.start()
"""
url_list = [
("东北F4模仿秀.mp4", "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0300f570000bvbmace0gvch71o53oog"),
("卡特扣篮.mp4", "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f3e0000cv52fpn5t6p007e34qlg")
]
def task(file_name, video_url):
res = requests.get(video_url)
with open(file_name, mode='wb') as f:
f.write(res.content)
print(file_name,time.time())
if __name__ == '__main__':
for name, url in url_list:
t = multiprocessing.Process(target=task, args=(name, url))
t.start()
3 GIL锁
GIL,全局解释器锁,是CPython 解释器特有的一个东西,让一个进程中同一时刻只能有一个线程可以被CPU调用。
- 如果程序想利用 计算机的多核优势,让CPU同时处理一些任务,适合用多进程开发(即使资源开销大)。
- 否则,适合用多线程开发。
总结:
- 计算密集型,用多进程,例如:大量的数据计算【累加计算示例】
- IO密集型,用多线程,例如:文件读写,网络数据传输【下载抖音示例】



