Loading

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调用

image

应用场景

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

image

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

image

总结

  • 计算密集型,用多进程,例如:大量的数据计算。
  • IO密集型,用多线程,例如:文件读写、网络数据传输。
posted @ 2024-12-02 11:16  一只大学生  阅读(18)  评论(0)    收藏  举报