Python_线程、线程效率测试、数据隔离测试、主线程和子线程
0、进程中的概念
三状态:就绪、运行、阻塞
就绪(Ready):当进程已分配到除CPU以外的所有必要资源,只要获得处理机便可立即执行,这时的进程状态成为就绪状态.
执行/运行(Running)状态:当进程已获得处理机,其程序正在处理机上执行,此时的进程状态成为执行状态.
阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态.引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等.
同步:一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
异步:不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖他的任务无法确定,所以是不可靠的任务序列。
进程是计算机中最小的资源分配单位。
基础的进行开启:
1 import time 2 from multiprocessing import Process 3 4 def f(name): 5 print('hello', name) 6 print('我是子进程') 7 8 if __name__ == '__main__': 9 p = Process(target=f, args=('bob',)) 10 p.start() 11 time.sleep(1) 12 print('执行主进程了')
1 D:\Python36\python.exe E:/Python/草稿纸.py 2 hello bob 3 我是子进程 4 执行主进程了 5 6 Process finished with exit code 0
锁 —— 互斥锁
信号量 —— 锁 + 计数器
事件 —— Python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法set、wait、clear。
事件处理的机制:全局定义了一个‘Flag’,如果‘Flag’值为False,那么当程序event.wait方法时就会阻塞,如果'Flag'值为True,那么event,wait方法便不再阻塞.
clear:将'Flag'设置为False.
set:将'Flag'设置为True.
数据共享 Manager : dict、list
进程都在同一台计算机上才能用。
数据在进程之间不安全。
进程之间的数据共享 : 消息中间
memcache
rabbitmq
redis
队列:管道 + 锁
处理任意数据类型
进程之间的数据安全 —— 进程安全
管道:
有两端
需要关闭不用的所有端口,才会在recv处报错。
进程不安全。
进程池:
什么情况下要用进程池:
高CPU型的代码需要用进程池。
进程池设定 CPU个数 + 1
Pool池:
apply 同步
apply_async 异步提交
get 获取返回值
close
join
map
apply_async的简化版
它内部实现了close, join
但是没有get方法,无法接受返回值。
回调函数 apply_async(callback=???)
回调函数是在主进程中执行的
在子进程执行完任务之后立刻将结果返回给回调函数,被回调函数作为参数进行下一步的处理。
信号量和池
在同一时刻只会有n个进程在执行代码
相似?不同?
信号量是有多少任务开多少进程,信号量仍然给操作系统到来了很多负担。
池中进程的数量是固定的,只是分别借用池中的进程来执行任务而已。
1、线程
线程是计算机中能被CPU调度的最小单位。
进程是计算机中资源分配的最小单位。
多线程的特点:
并发;
轻量级;
数据不隔离。
多进程的特点:
并发的;
操作比较重;
数据完全隔离
2、线程效率测试
1 import os 2 import time 3 from threading import Thread 4 5 6 # 线程 Tread 7 8 def func(): 9 for i in range(10): 10 print('in thread:', i, os.getpid()) 11 time.sleep(0.5) 12 13 14 if __name__ == '__main__': 15 t = Thread(target=func) 16 t.start() 17 time.sleep(1) 18 print('in main', os.getpid()) 19 time.sleep(1) 20 print('in main 2', os.getpid())
1 D:\Python36\python.exe E:/Python/草稿纸.py 2 in thread: 0 14936 3 in thread: 1 14936 4 in main 14936 5 in thread: 2 14936 6 in thread: 3 14936 7 in main 2 14936 8 in thread: 4 14936 9 in thread: 5 14936 10 in thread: 6 14936 11 in thread: 7 14936 12 in thread: 8 14936 13 in thread: 9 14936 14 15 Process finished with exit code 0
3、数据隔离测试
未完待续。。。
4、主线程和子线程
未完待续。。。