第13次预习课-20180919 多进程编程
多进程编程
进程和线程之间的区别
Linux查看:
1)进程: ps –ef
2)跟python相关的进程 ps –ef|grep python
[root@iZ2zejbxp2btn9jh8knipuZ ~]# ps -ef|grep python
root 7717 7665 0 21:05 pts/0 00:00:00 grep python
root 16527 1 0 Aug16 ? 04:01:07 python run.py
Windows:
启动任务管理器-进程
程序不是进程,当程序处于运行状态,才是进程
https://www.cnblogs.com/ChunJian-YANG/p/5506209.html
同步和异步:
顺序执行:同步
不需要按照顺序执行:异步。异步执行快,可以解决效率的问题
什么时候用同步?什么时候用异步?
有依赖关系的时候只能用同步,没有依赖关系的时候,可同步,可异步。(不需要前面步骤的处理结果)
进程:
程序块、数据块、进程控制块三部分组成
进程有3个状态:
就绪态,运行台,等待态
cpu是如何工作的?1台机器1个cpu,1核,运行10个进程
按照时间片执行,不停的上下文切换
内存,硬盘
内存比硬盘快 10-15倍左右,内存的空间比较宝贵
掉电之后,内存的数据不保留,硬盘会保留
内存不够的时候,windows 使用虚拟内存,linux使用交换分区swap,将内存的数据存在磁盘中,从磁盘中取回。
进程至少有一个线程,线程依存于进程内部;
一个进程如果有多个线程,所有的线程会共用这个进程的资源和数据。
进程间如何共享数据?
1)设置全局共享变量;
2)建立通信;
3)数据写入一个文件中。
进程是操作系统分配资源的基本单位
Python使用多进程实现更好的并发。
性能测试:模拟多个进程或者线程,发送大量的请求给服务器端。
Python实现并发的方式:
多进程:用到多核CPU
多线程: 只能用单核CPU,GIL全局解释器锁。并发请求有多IO的时候。
协程:单线程,发现IO等待的时候会跳过去。不用锁。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Linux 下通过fork生成进程
"""
pid=os.fork()
1.只用在Unix系统中有效,Windows系统中无效
2.fork函数调用一次,返回两次:
在父进程中返回值为子进程id,在子进程中返回值为0
"""
import os
pid=os.fork() #生成一个子进程,出现了2个进程同时开始向下执行
if pid==0:
print("执行子进程,子进程pid={pid},父进程ppid={ppid}".\
format(pid=os.getpid(),ppid=os.getppid()))
else:
print("执行父进程,子进程pid={pid},父进程ppid={ppid}".\
format(pid=pid,ppid=os.getpid()))
-------------------------------------------------------------------------------------------------------------------------------------------------------
理解:
os.fork() 执行的时候会生成子进程,主程序还有一个主进程,此时出了2个进程,一个主进程,一个是子进程
os.fork()规定,主进程自动获取函数返回值是子进程的pid,子进程获取函数返回值是0
主进程:pid=19293
else:
print("执行父进程,子进程pid={pid},父进程ppid={ppid}".\
format(pid=pid,ppid=os.getpid()))
子进程:pid = 0
if pid==0:
print("执行子进程,子进程pid={pid},父进程ppid={ppid}".\
format(pid=os.getpid(),ppid=os.getppid()))
综合起来看,因为2个进程分别执行if和else的代码块,所以最后的结果是,if被子进程执行了一次,else被主进程执行了一次
-------------------------------------------------------------------------------------------------------------------------------------------------------
"""
Process常用属性与方法:
name:进程名
pid:进程id
run(),自定义子类时覆写
start(),开启进程
join(timeout=None),阻塞进程
terminate(),终止进程
is_alive(),判断进程是否存活
"""
import os,time
from multiprocessing import Process
def worker():
print("子进程执行中>>> pid={0},ppid={1}".format(os.getpid(),os.getppid()))
time.sleep(2)
print("子进程终止>>> pid={0}".format(os.getpid()))
def main():
print("主进程执行中>>> pid={0}".format(os.getpid()))
ps=[]
# 创建子进程实例
for i in range(2):
p=Process(target=worker,name="worker"+str(i),args=())
ps.append(p)
# 开启进程
for i in range(2):
ps[i].start()
# 阻塞进程
for i in range(2):
ps[i].join()
print("主进程终止")
if __name__ == '__main__': #当本程序被python执行的时候,执行包含的内容main()
main()