第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()

 

 

posted @ 2018-10-09 10:02  feifei_tian  阅读(154)  评论(0编辑  收藏  举报