zoukankan      html  css  js  c++  java
  • # 并发编程 -进程理论-进程的方法

    1.并发编程

     1 """"""
     2 """计算机发展史"""
     3 """
     4 1.计算机发展史
     5     1.手工操作,穿孔卡片
     6         同一个房间同一时刻只能运行一个程序,效率极低
     7     2.联机批处理-随身听
     8         磁带(小红,小王,小李) -->{ 输入机 -(程序,数据)-> 计算机 -(结果)-> 输出机}(用户)
     9         效率虽然有所提升,但仍然很低
    10     3.脱机批处理系统--提高CPU利用率
    11         硬盘 - > 卫星机 - > 内存 - > 主机
    12         作用:避免工作速率快的部件与慢的部件接触,拖慢运行速度
    13 
    14     4.多道技术(*)
    15         1.基于单核研究
    16         单道 -> -> -> 
    17         ps:单道,运行a只能运行a,a完运行b
    18         2.多道技术(a,b程序衔接紧密,当a进入IO时,调走cpu运行b,CPU空置很少)
    19         多道: -> -> -> 
    20             -> -> ->         
    21 """
    22 """
    23 ***多道技术
    24     1.空间上的复用,
    25         多个程序共用一套计算机硬件
    26     2.时间的复用
    27         切换+保存状态
    28         1.当一个程序遇到IO操作,操作系统会剥夺该程序CPU执行权限(提高cpu利用率,并且也不影响程序的执行效率)
    29         2.当一个程序长时间占用cpu 操作系统也会剥夺该程序cpu执行权限(降低了程序的执行效率)
    30 
    31 *并发:看起来像同时运行的就可以了
    32 *并行:真正意义上的同时执行
    33     单核和计算机不能实现并行,但是可以实现并发
    34 """
    1.计算机发展史--多道技术.py

    2.2进程三态图.png


    2.进程三个状态转换图.png

     1 ''''''
     2 """
     3 程序:一坨代码
     4 进程:正在运行的程序
     5 """
     6 """
     7 进程理论
     8 """
     9 """
    10 1.时间片轮转法(多级反馈队列)
    11     时间片:就好比将一秒等分成N份
    12     linux可以给制定程序设置优先级
    13     程序按优先级从高到低执行
    14     
    15 """
    16 """
    17 2.进程三个状态转化
    18     1.就绪态
    19     程序在开始运行之后,并不是立即开始执行代码,而是进入就绪状态,等待操作系统调度开始运行
    20     2.运行态
    21     程序运行状态
    22     # import time
    23     # print('程序开始执行')
    24     3.阻塞态
    25     在这里遇到等待用户输入操作
    26     程序进入阻塞状态
    27     # name = input('name>>>').strip()
    28     4.就绪态
    29     用户输入之后,进程不是立即执行,
    30     而是进入就绪状态,等待操作系统调度继续运行
    31     5.运行态
    32     # print(name)
    33     6.阻塞态
    34     # time.sleep(1)
    35     7.就绪态
    36     8.运行态
    37     # print('程序运行结束')
    38     9.结束
    39 """
    2.进程理论.py
     1 """"""
     2 """
     3 1.同步异步:
     4     表示任务的提交方式
     5     
     6     同步:
     7         任务提交后,原地等待的任务的执行并返回执行结果才走 ,
     8         期间不做任何事
     9         (秩序层面的表现就是卡住了)
    10         
    11     异步:
    12         任务提交后,不在原地等待,而是继续执行下一行代码
    13         (结果是要的 但是通过其他方式过去)
    14 """
    15 # 异步
    16 def func():
    17     print('kfgdldf')
    18 p = func()
    19 # 同步
    20 def coun():
    21     x =1
    22     return x
    23 q = coun()
    24 print(q)
    25 """
    26 2.阻塞非阻塞
    27     表示程序的运行状态
    28     阻塞:阻塞态
    29     非阻塞:运行态,就绪态
    30     
    31 """
    32 """
    33 ps:
    34     强调同步异步,阻塞非阻塞是两队概念,不能混为一谈
    35 """
    3.同步和异步,阻塞和非阻塞.py

    2.创建进程的两种方式

     1 ''''''
     2 """
     3 特性:进程间相互隔离的
     4 """
     5 """
     6 1.创建进程方法一  直接实例化Process,将要执行用target传入
     7 """
     8 
     9 
    10 
    11 from multiprocessing import Process
    12 import time
    13 import os
    14 def task(name):
    15     print("%s is running"%name)
    16     print('son run!')
    17     print('son:%s'%os.getpid())
    18     print('father:%s'%os.getppid())
    19     print('son over!')
    20     time.sleep(3)
    21     print('%s is over'%name)
    22 
    23 
    24 if __name__ == '__main__':
    25     # 创建一个进程对象
    26     q = Process(target=task,args=('llx',))
    27     # 告诉操作系统帮你上见
    28     print(os.getpid())
    29     q.start()
    30     print('')
    31 """
    32 13144
    33 34 llx is running
    35 son run!
    36 son:14280
    37 father:13144
    38 son over!
    39 llx is over
    40 """
    1.创建进程方法一 直接实例化Process,将要执行用target传入.py
     1 """"""
     2 from multiprocessing import Process
     3 import time
     4 import os
     5 class MyProcess(Process):
     6     def __init__(self,name):
     7         super().__init__()
     8         self.name = name
     9     def run(self):
    10         print("%s is running"%self.name)
    11         print('son run:%s'%os.getpid())
    12         time.sleep(3)
    13         print('father run:%s'%os.getppid())
    14         print("%s is over"%self.name)
    15 if __name__ == '__main__':
    16     p = MyProcess('llx')
    17     p.start()
    18     print('')
    19     """
    20 21 llx is running
    22 son run:20772
    23 father run:476
    24 llx is over
    25     """
    2.创建进程方法二 继承Process类,覆盖run的方法,将任务放入run方法中.py
     1 """"""
     2 """
     3 window 创建进程会将代码以模块的方式,从上往下执行一遍
     4 
     5 linux会直接将代码完完整整的拷贝一份
     6 """
     7 """
     8 window 创建进程一定要在if __name__ == '__main__':
     9 代码块内创建,否则报错
    10 """
    11 """
    12 本质:
    13     创建进程 就是内存中重新开辟一块内存空间
    14     将允许产生的代码丢进去,
    15     一个进程对应在内存就是一块独立的内存空间
    16 
    17 """
    18 """
    19 进程与进程之间数据是隔离的
    20     无法直接交互
    21     但是可以通过某些技术实现间接交互
    22 """
    23 from multiprocessing import Process
    24 import os
    25 # def test(name):
    26 #     print("son:%s"%os.getpid())
    27 #     print('f:%s'%os.getppid())
    28 # if __name__ == '__main__':
    29 #     p = Process(target=test,args=('llx',))
    30 #     p.start()
    31 #     print('l')
    32 class MyProcess(Process):
    33     def __init__(self,name):
    34         super().__init__()
    35         self.name = name
    36     def run(self):
    37         print("son:%s"%os.getpid())
    38         print('f:%s'%os.getppid())
    39 if __name__ == '__main__':
    40     p = MyProcess('llx')
    41     p.start()
    42     print('2')
    3.创建进程的原理.py

    3.jion方法

     1 from multiprocessing import Process
     2 import time
     3 
     4 def test(name,i):
     5     print('%s is running'%name)
     6     time.sleep(i)
     7     print('%s is over'%name)
     8 if __name__ == '__main__':
     9     p_list = []
    10     for i in range(3):
    11         p = Process(target=test,args=('进程%s'%i,i))
    12         p.start()
    13         p_list.append(p)
    14     for p in p_list:
    15         p.join()
    16 """
    17 进程0 is running
    18 进程0 is over
    19 进程1 is running
    20 进程2 is running
    21 进程1 is over
    22 进程2 is over
    23 """
    1join方法.py
     1 from multiprocessing import Process
     2 import time
     3 
     4 def test(name,i):
     5     print('%s is running'%name)
     6     time.sleep(i)
     7     print('%s is over'%name)
     8 if __name__ == '__main__':
     9     p_list = []
    10     # for i in range(3):
    11     #     p = Process(target=test,args=('进程%s'%i,i))
    12     #     p.start()
    13     #     p_list.append(p)
    14     # for p in p_list:
    15     #     p.join()
    16     p = Process(target=test,args=('a',1))
    17     p1 = Process(target=test,args=('b',2))
    18     p2 = Process(target=test,args=('c',3))
    19     start_time = time.time()
    20     p.start()  # 仅仅是告诉操作系统帮你创建一个进程 至于这个进程什么时候创  操作系统随机决定
    21     p1.start()
    22     p2.start()
    23     p2.join()
    24     p.join()
    25     p1.join()
    26 
    27     # 主进程代码等待子进程运行结束 才继续运行
    28     # p.join()  # 主进程代码等待子进程运行结束
    29     print('')
    30     print(time.time() - start_time)
    31 
    32 """
    33 a is running
    34 b is running
    35 c is running
    36 a is over
    37 b is over
    38 c is over
    39 40 3.23988938331604
    41 """
    2.join方法解释.py

    4.进程之间数据是相互隔离的

     1 from multiprocessing import Process
     2 import time
     3 
     4 
     5 money = 100
     6 
     7 def test():
     8     global money
     9     money = 99999999
    10     print(money,'11111111111')
    11 
    12 
    13 if __name__ == '__main__':
    14     p = Process(target=test)
    15     p.start()
    16     p.join()
    17     print(money)
    18 
    19 '''
    20 99999999 11111111111
    21 100
    22 '''
    1.进程间数据是相互隔离的,证明.py

    5.进程对象及其他方法

     1 """"""
     2 """tasklist"""
     3 '''
     4 
     5 映像名称                       PID 会话名              会
     6 话#       内存使用
     7 ========================= ======== ================ ======
     8 ===== ============
     9 System Idle Process              0 Services
    10     0          8 K
    11 System                           4 Services
    12     0         24 K
    13 Registry                       120 Services
    14     0     15,636 K
    15 smss.exe                       444 Services
    16     0        524 K
    17 csrss.exe                      648 Services
    18     0      1,832 K
    19 wininit.exe                    820 Services
    20     0      2,592 K
    21 services.exe                   892 Services
    22     0      6,428 K
    23 lsass.exe                      908 Services
    24     0     10,344 K
    25 svchost.exe                     92 Services
    26     0        356 K
    27 .....................
    28 '''
    29 """tasklist|find 20052"""
    30 '''
    31 E:Python课堂内容整理知识点框架函数--装饰器--迭代器--生
    32 成器--常用模块--ATMday30并发编程>tasklist|findstr 20052
    33 pycharm64.exe                20052 Console
    34     5    862,692 K
    35 
    36 '''
    2.cmd,查询端口.py
     1 from multiprocessing import Process,current_process
     2 import os
     3 import time
     4 
     5 def test(name):
     6     print('%s is running'%name,current_process().pid)
     7     print('%s is running'%name,'子进程%s'%os.getppid(),'父进程%s'%os.getppid())
     8     time.sleep(3)
     9     print('%s is over'%name)
    10 if __name__ == '__main__':
    11     p = Process(target=test,args=('llx',))
    12     p.start()
    13     p.terminate()  # 1.杀死当前进程其实是告诉操作系统帮你杀死一个进程
    14     #time.sleep(0.1)
    15     print(p.is_alive()) # 2 .判断进程是否存活
    16     print('',os.getpid(),'主主进程%s'%os.getppid())
    17 
    18 """
    19 True
    20 主 21484 主主进程20052
    21 llx is running 21832
    22 llx is running 子进程21484 父进程21484
    23 llx is over
    24 """
    25 """
    26 E:Python课堂内容整理知识点框架函数--装饰器--迭代器--生
    27 成器--常用模块--ATMday30并发编程>tasklist|findstr 20052
    28 pycharm64.exe                20052 Console
    29     5    862,692 K
    30 
    31 """
    1.进程对象及其他方法.py


    6.僵尸进城,和孤儿进程

     1 ''''''
     2 """僵尸进城"""
     3 '''
     4 僵尸进城
     5 
     6 值得是,子进程已经结束了,但是操作系统会保存一些进程信息,如PID,运行时间等,此时这个进程就称之为僵尸进程 
     7 
     8 僵尸进程如果太多将会占用大量的资源,造成系统无法开启新新进程
     9 
    10 linux 中有一个wai/waitpid 用于父进程回收子进程资源
    11 
    12 python会自动回收僵尸进程 
    13 '''
    14 """
    15 父进程回收子进程资源的两种方式
    16         1.join方法
    17         2.父进程正常死亡
    18     所有的进程都会步入僵尸进程
    19 """
    1.僵尸进城.py
     1 ''''''
     2 """
     3 孤儿进程
     4 """
     5 """
     6 孤儿进程
     7 
     8 指的是,父进程先结束 ,而子进程还在运行着,
     9 
    10 孤儿进程无害,有 其存在的必要性
    11 
    12 例如:qq开启了浏览器,qq先退出了  浏览器应该继续运行 
    13 
    14 孤儿进程会被操作系统接管   
    15 """
    16 '''
    17 孤儿进程
    18         子进程没死 父进程意外死亡
    19         
    20         针对linux会有儿童福利院(init) 如果父进程意外死亡他所创建的子进程都会被福利院收养
    21 '''
    2.孤儿进程.py

    7.守护进程

     1 from multiprocessing import Process
     2 import time
     3 def test(name):
     4     print('%s 总管正常活着'%name)
     5     time.sleep(3)
     6     print('%s总管正常死亡'%name)
     7 if __name__ == '__main__':
     8     p = Process(target=test,args=('llx',))
     9     # 设置守护进程,p.daemon = True 这一句话必须放在start语句之前 否则报错
    10     p.daemon = True
    11     p.start()
    12     time.sleep(0.1)
    13     print('皇帝jason寿正终寝')
    14 '''
    15 为设置守护进程前:
    16 皇帝jason寿正终寝
    17 llx 总管正常活着
    18 llx总管正常死亡
    19 '''
    20 """设置为守护进程后"""
    21 """
    22 llx 总管正常活着
    23 皇帝jason寿正终寝
    24 """
    守护进程

    8.互斥锁

     1 from multiprocessing import Process
     2 # 导入锁的模块
     3 from multiprocessing import Lock
     4 import time
     5 import json
     6 
     7 # 查票
     8 def search(i):
     9     with open('data','r',encoding='utf-8') as f:
    10         data = f.read()
    11     t_d = json.loads(data)
    12     print('用户%s查询余票为:%s'%(i,t_d.get('ticket')))
    13 
    14 # 买票
    15 def buy(i):
    16     with open('data','r',encoding='utf-8') as f:
    17         data = f.read()
    18     t_d = json.loads(data)
    19     time.sleep(1)
    20     if t_d.get('ticket') > 0:
    21         # 票数减一
    22         t_d['ticket'] -= 1
    23         # 更新票数
    24         with open('data','w',encoding='utf-8') as f:
    25             json.dump(t_d,f)
    26         print('用户%s抢票成功'%i)
    27     else:
    28         print('没票了')
    29 
    30 
    31 def run(i,lock):
    32     search(i)
    33     lock.acquire()  # 抢锁  只要有人抢到了锁 其他人必须等待该人释放锁
    34     buy(i)
    35     lock.release()  # 释放锁
    36 
    37 
    38 if __name__ == '__main__':
    39     lock = Lock()
    40     # 生成了一把锁
    41     for i in range(10):
    42         p = Process(target=run,args=(i,lock))
    43         p.start()
    44 
    45 """
    46 用户0查询余票为:1
    47 用户1查询余票为:1
    48 用户2查询余票为:1
    49 用户3查询余票为:1
    50 用户4查询余票为:1
    51 用户5查询余票为:1
    52 用户6查询余票为:1
    53 用户7查询余票为:1
    54 用户8查询余票为:1
    55 用户9查询余票为:1
    56 用户0抢票成功
    57 没票了
    58 没票了
    59 没票了
    60 没票了
    61 没票了
    62 没票了
    63 没票了
    64 没票了
    65 没票了
    66 """
    1.案例,抢票实现案例.py
     1 from multiprocessing import Process,Lock
     2 import time
     3 import json
     4 
     5 # 查票
     6 def search(i):
     7     with open('date','r',encoding='utf-8')as f:
     8         date = f.read()
     9     t_d = json.loads(date)
    10     print('用户%s查询余票为%s'%(i,t_d.get('ticket')))
    11 # p = search(1)
    12 # print(p)
    13 # """用户1查询余票为1"""
    14 # 买票
    15 def buy(i):
    16     with open('date','r',encoding='utf-8')as f:
    17         date = f.read()
    18     t_d = json.loads(date)
    19     time.sleep(1)
    20     if t_d.get('ticket') > 0:
    21         # 票数减一
    22         t_d["ticket"] -= 1
    23         # 更新票数
    24         with open('date','w',encoding='utf-8')as f:
    25             json.dump(t_d,f)
    26             print('用户%s抢票成功'%i)
    27     else:
    28         print('没票了')
    29 
    30 def run(i):
    31     search(i)
    32     buy(i)
    33 if __name__ == '__main__':
    34     for i in range(10):
    35         p = Process(target=run,args=(i,))
    36 
    37         p.start()
    2.无锁的买票情况.py
    1 {"ticket": 1}
    data-date
  • 相关阅读:
    mysql常用基本命令
    mysql8.0.13下载与安装图文教程
    k8s ingress 增加跨域配置
    Jenkins 备份恢复插件 thinBackup 使用
    k8s HA master 节点宕机修复
    nginx 跨域问题解决
    mongodb 3.4.24 主从复制
    k8s 线上安装 jenkins并结合 jenkinsfile 实现 helm 自动化部署
    k8s helm 运用与自建helm仓库chartmuseum
    centos6 源码安装 unzip
  • 原文地址:https://www.cnblogs.com/llx--20190411/p/11337818.html
Copyright © 2011-2022 走看看