Python多线程基础

同步和异步

同步

其实类似于小学时期如何在最短的时间内去完成所有事件的数学题。

假设小明早上7:00起床,刷牙洗脸需要3分钟,烧水需要10分钟,穿衣叠被需要2分钟,吃早餐需要15分钟,收听早间新闻需要20分钟(7点开始),问小明起床做完这些事情至少需要多长时间?

同步是指调用一旦开始,必须等待返回调用的结果,才能继续下一步操作

那么结果就是,小明一共需要听新闻(20分钟)+穿衣叠被(2分钟)+刷牙洗脸(3分钟)+烧水(10分钟)+吃早餐(15分钟),总共50分钟,一定要迟到了,很笨

异步

异步和同步相反,调用一旦开始,调用者无需等待方法的完成,就可以继续执行后续方法,被调用者通过状态体通知调用者,或者使用回调函数处理调用

异步方法下,小明需要打开新闻,开始烧水,穿衣叠被,再洗漱,吃早餐,只需要20分钟,新闻结束,就可以高高兴兴去上学了

并发和并行

并发

并发是同时具有多个活动的系统,实质是一个或多个物理CPU在若干道程序(或线程)之间多路复用,其实就是n个事件在同一时间线上交替完成:小明做完所有事件花了50分钟

并发

并行

并行是真正意义上的不同事件或线程在同一时刻同时执行。并行利用并发使系统运行更快,在操作系统的多个抽象层次运用,是n个事件在同一时刻上同时发生:小明家里雇了4个机器人保姆,1个打开电视后烧水,1个帮小明穿衣叠被,1个帮小明洗漱,最后1个喂小明吃早餐,这样在早间新闻放完前,小明只用了18分钟就完成了所有事件,还多出2分钟时间检查书包

并行

进程和线程

进程

程序不能自己运行,只有将程序装载进内存,由系统分配资源后才能运行。程序是指令的集合,可以视为指令的静态文本,而进程是指令的执行活动,是动态的行为

进程是操作系统对于一个运行中程序的抽象,是CPU、内存、IO设备的抽象。系统可以同时运行多个进程

线程

线程是操作系统进行运算调度的最小单位,被包含于进程中,是进程的实际运作单位。一个进程可以由多个线程组成,线程之间共享代码和数据。

由于在实际网络服务器中对并行的需求,线程成为重要的编程模型:

1.多线程之间比多进程之间更易共享数据。
2.线程一般比进程高效。

python进程创建

1
2
3
4
import multiprocessing

进程对象 = multiprocessing.Process(target=函数名或当前任务,*args/**kwargs)
进程对象.start()

进程编号

1
2
3
4
import os

os.getpid() #获取当前进程的编号
os.getppid() #获取当前进程父进程的编号

主进程往往会等待所有的子进程完成以后才结束

可以设置守护主进程,当主进程结束以后子进程中止

1
2
3
4
进程对象 = multiprocessing.Process(target=函数名或当前任务, daemon=True)

#或
进程对象.daemon = True

举例-文件拷贝程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os
import multiprocessing
def copy_file(file_name, source_dir, dest_dir):
source_path = source_dir + '\\' + file_name
dest_path = dest_dir + '\\' + file_name

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 = r'C:\Users\elbadaernU9.9\Desktop\新建文件夹 (1)'
dest_dir= r'F:C:\Users\elbadaernU9.9\Desktop\新建文件夹 (2)'
try:
os.mkdir(dest_dir)
except:
print("目标文件夹已经存在")
file_list = os.listdir(source_dir)
for file_name in file_list:
sub_process = multiprocessing.Process(target=copy_file, args=(file_name, source_dir, dest_dir))
sub_process.start()

python线程创建

1
2
3
4
import threading

线程对象 = threading.Thread(target=函数名或当前任务,*args/**kwargs)
线程对象.start()

多线程-文件拷贝程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

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 = r'C:\Users\elbadaernU9.9\Desktop\新建文件夹 (1)'
dest_dir= r'F:C:\Users\elbadaernU9.9\Desktop\新建文件夹 (2)'
try:
os.mkdir(dest_dir)
except:
print("目标文件夹已经存在")
file_list = os.listdir(source_dir)
for file_name in file_list:
sub_thread = threading.Thread(target=copy_file, args=(file_name, source_dir, dest_dir))
sub_thread.start()

进程与线程的关系对比

进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位。线程依附于进程,不能脱离进程独立存在。一个进程默认提供了一条线程,可以创建多个线程

创建进程的资源开销较大,可以使用CPU多核,线程的资源开销小,只能在单核模式运行

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2024 青域 All Rights Reserved.

UV : | PV :