文章目录

  • 1. 概念
  • 2. 多进程完成多任务
  • 3. 多进程实战案例
  • 4. 多线程执行多任务
  • 5. 多线程实战案例

1. 概念

  • 多任务:同一时间执行多个任务。
    ①并发:一段时间交替执行多个任务。
    ②并行:同时一起执行多个任务。
  • 进程:一个正在运行的程序。
    ①操作系统需要为每个进程分配资源。
    ②可创建的进程数量有限。
  • 线程: 是程序执行的最小单元。
  • 对比
    ①关系:线程依附于进程,一个进程可能有多个线程。
    ②区别:创建进程的开销比线程要大,进程是操作系统资源分配的基本单元,线程是CPU调度的基本单位。线程不能独立运行。
    ③优缺点:进程可以用多核,但资源开销大且进程数量有限。线程资源开销小,但不能使用多核。

2. 多进程完成多任务

(1)进程创建步骤

python的多进程和java的多线程 python 多线程和多进程_多任务

  • 创建进程对象创建进程时必须指定目标任务名,也就是函数名

(2)进程执行带参数的任务

python的多进程和java的多线程 python 多线程和多进程_多任务_02

(3)获得进程编号

python的多进程和java的多线程 python 多线程和多进程_线程_03

(4)注意点

  • 主进程会等待所有子进程执行结束后再结束:主进程并不是不再执行了,而是不会再子进程结束前结束。
  • 设置守护子进程:一旦主进程结束,子进程自动销毁。
进程对象.daemon = true;

3. 多进程实战案例

(1)需求分析

实现一个高并发的多任务拷贝器。

python的多进程和java的多线程 python 多线程和多进程_线程_04


(2)代码

import os
import multiprocessing

def copy_file(file_name, source_dir, dest_dir):
	# 1. 拼接文件路径和文件名
    source_path = source_dir + '/' + file_name
    dest_path = dest_dir + '/' + file_name
	
	# 2. 循环读取、复制文件
    print(source_path, '--->', dest_path)
    with open(source_path, 'rb') as source_file:
        with open(dest_path, 'wb') as dest_file:
            while True:
                data = source_file.read(1024)
                if data:
                    dest_file.write(data)
                else:
                    break
if __name__ == '__main__':
    source_dir = 'python图片'
    dest_dir = 'python图片(复制)'

    # 1. 创建文件夹
    try:
        os.mkdir(dest_dir)
    except:
        print('目标文件已存在')

    # 2. 读取文件列表
    file_list = os.listdir(source_dir)
    print(file_list)

    # 遍历每个文件,专门实现文件拷贝
    for file_name in file_list:
        sub_process = multiprocessing.Process(target=copy_file,
                                              args=(file_name, source_dir, dest_dir))
        sub_process.start()


4. 多线程执行多任务

(1)创建步骤

python的多进程和java的多线程 python 多线程和多进程_多线程_05


python的多进程和java的多线程 python 多线程和多进程_多任务_06


(2)线程执行带参数的任务

python的多进程和java的多线程 python 多线程和多进程_多任务_02

(3)主线程和子线程的执行顺序

  • 主线程会等待所有子线程结束后才能结束
  • 设置守护子线程:一旦主线程结束,子线程自动销毁。
线程对象.setDaemon = true;

(4)线程之间的执行顺序

  • 多线程之间执行是无序的:由cpu调度决定。

5. 多线程实战案例

(1)需求分析

实现一个高并发的多任务拷贝器。

python的多进程和java的多线程 python 多线程和多进程_线程_04


(2)代码

import os
import threading

def copy_file(file_name, source_dir, dest_dir):
    source_path = source_dir + '/' + file_name
    dest_path = dest_dir + '/' + file_name

    print(source_path, '--->', dest_path)
    with open(source_path, 'rb') as source_file:
        with open(dest_path, 'wb') as dest_file:
            while True:
                data = source_file.read(1024)
                if data:
                    dest_file.write(data)
                else:
                    break
if __name__ == '__main__':
    source_dir = 'python图片'
    dest_dir = 'python图片(复制2)'

    # 1. 创建文件夹
    try:
        os.mkdir(dest_dir)
    except:
        print('目标文件已存在')

    # 2. 读取文件列表
    file_list = os.listdir(source_dir)
    print(file_list)

    # 遍历每个文件,专门实现文件拷贝
    for file_name in file_list:
        sub_process = threading.Thread(target=copy_file,
                                      args=(file_name, source_dir, dest_dir))
        sub_process.start()