python中进程和线程
介绍
线程,是计算机中可以被cpu调度的最小单元。
进程,是计算机资源分配的最小单元(进程为线程提供资源)
一个进程中可以有多个线程,同一个进程中的线程可以共享此进程中的资源。
线程、进程使用示例
普通下载三个视频
import time
import requests
url_list = [
("视频1.mp4", "https://th.bing.com/th?&id=OVP.V0ZkjEQ_e4xT9DEYvLHCWQIIEk&w=256&h=143&c=7&pid=2.1&rs=1"),
("视频2.mp4", "https://th.bing.com/th?&id=OVP.xk6M9q6Z9wIRiQkR14TUJgCoEs&w=256&h=144&c=7&pid=2.1&rs=1"),
("视频3.mp4", "https://th.bing.com/th?&id=OVP.0P2TpgmZoP71g32teJ-wugIIFE&w=256&h=143&c=7&pid=2.1&rs=1"),
]
print(time.time())
for file_name, url in url_list:
res = requests.get(url)
with open(file_name, "wb") as f:
f.write(res.content)
print(time.time())
多线程下载
import requests
import threading
url_list = [
("视频1.mp4", "https://th.bing.com/th?&id=OVP.V0ZkjEQ_e4xT9DEYvLHCWQIIEk&w=256&h=143&c=7&pid=2.1&rs=1"),
("视频2.mp4", "https://th.bing.com/th?&id=OVP.xk6M9q6Z9wIRiQkR14TUJgCoEs&w=256&h=144&c=7&pid=2.1&rs=1"),
("视频3.mp4", "https://th.bing.com/th?&id=OVP.0P2TpgmZoP71g32teJ-wugIIFE&w=256&h=143&c=7&pid=2.1&rs=1"),
]
def task(file_name, file_url):
res = requests.get(file_url)
with open(file_name, "wb") as f:
f.write(res.content)
for name, url in url_list:
# 创建一个线程
t = threading.Thread(target=task, args=(name, url))
# 执行该线程
t.start()
多进程下载
import requests
import multiprocessing
url_list = [
("视频1.mp4", "https://th.bing.com/th?&id=OVP.V0ZkjEQ_e4xT9DEYvLHCWQIIEk&w=256&h=143&c=7&pid=2.1&rs=1"),
("视频2.mp4", "https://th.bing.com/th?&id=OVP.xk6M9q6Z9wIRiQkR14TUJgCoEs&w=256&h=144&c=7&pid=2.1&rs=1"),
("视频3.mp4", "https://th.bing.com/th?&id=OVP.0P2TpgmZoP71g32teJ-wugIIFE&w=256&h=143&c=7&pid=2.1&rs=1"),
]
def task(file_name, file_url):
res = requests.get(file_url)
with open(file_name, "wb") as f:
f.write(res.content)
# Linux系统fork;win:spawn;mac支持:fork和spawn (python3.8默认设置spawn)。
# spawn创建多进程需要设置主模块
if __name__ == '__main__':
for name, url in url_list:
# 创建一个进程
t = multiprocessing.Process(target=task, args=(name, url))
# 执行该进程
t.start()
多进程比多线程资源开销大
线程、进程适用场景
常见的程序开发中,计算操作需要使用CPU多核优势,IO操作不需要利用CPU的多核优势,所以,就有这一句话:
- 计算密集型,用多进程,例如:大量的数据计算。
- IO密集型,用多线程,例如:文件读写、网络数据传输。
GIL锁
介绍
GlL,全局解释器锁(Global Interpreter Lock)),是CPython解释器特有一个玩意,让一个进程中同一个时刻只能有一个线程可以被CPU调用

应用场景
如果程序想利用计算机的多核优势,让CPU同时处理一些任务,适合用多进程开发(即使资源开销大)。

如果程序不利用计算机的多核优势,适合用多线程开发。

总结
- 计算密集型,用多进程,例如:大量的数据计算。
- IO密集型,用多线程,例如:文件读写、网络数据传输。

浙公网安备 33010602011771号