计算机发展史 进程

多道技术

1.空间上的复用: 多个程序共用一套计算机硬件

2.时间上的复用: 切换+保存状态

  1.当一个程序遇到IO操作,操作系统会剥夺该程序的cpu执行权限(提高了cpu的利用率 并且也不影响程序的执行效率)

  2.当一个程序长时间占用cpu 操作系统也会剥夺该程序的cpu执行权限(降低了程序的执行效率)

  并发:看起来像同时运行的就可以
       并行:真正意义上的同时执行
            单核的计算机能不能实现并行,但是可以实现并发

同步异步:表示的是任务的提交方式
        同步:任务提交之后 原地等待的任务的执行并拿到返回结果才走 期间不做任何事(程序层面的    表现就是卡住了)
        异步:任务提交之后 不再原地等待 而是继续执行下一行代码(结果是要的  但是是用过其他方式    获取)

阻塞非阻塞:表示的程序的运行状态
        阻塞:阻塞态
        非阻塞:就绪态 运行态

创建进程的两种方式

# 创建进程会将代码以模块的方式从上往下执行一遍
方式一
from multiprocessing import Process
import time
def test(name):
    print('%s'%name)
    time.sleep(1)
    print('hi')
if __name__ == '__main__':  #在创建进程时,在if __name__ == '__main__':内创建
    p = Process(target=test,args=('egon',))  #创建一个进程对象
    p.start()  #告诉操作系统,要创建一个进程
    time.sleep(1)
    print('hello')
方式二
from multiprocessing import Process
import time
class MyClass(Process):
    def __init__(self,name):
        super().__init__()
        self.name = name
    def test(self):
        print('%s'%self.name)
        time.sleep(1)
        print('hi')
if __name__ == '__main__':
    p = MyClass('egon')
    p.start()
    p.test()
    print('gun')

join方法是先执行完子程序之后. 在执行主程序

from multiprocessing import Process
import time
def test(name,i):
    time.sleep(i)
    print('hello')
if __name__ == '__main__':

    # p_list = []
    # for i in range(3):
    #     p = Process(target=test,args=('进程',i))
    #     p.start()
    #     p_list.append(p)
    # for p in p_list:
    #     p.join()
    # print('gun')

    p = Process(target=test,args=('egon',1))
    p1 = Process(target=test,args=('jason',2))
    start_time = time.time()
    p.start()
    p1.start()
    p.join()
    p1.join()
    print('hi')
    print(time.time()-start_time)

进程对象的其他方法

from multiprocessing import Process,current_process
import os
import time
def test(name):
    print('%s'%name,current_process().pid,'子进程%s'%os.getpid(),'父进程%s'%os.getppid())
    time.sleep(2)
    print('hello')
if __name__ == '__main__':
    p = Process(target=test,args=('egon',))
    p.start()
    time.sleep(1)
    p.terminate()  # 杀死当前进程,本质是让操作系统帮你去杀死一个进程
    time.sleep(1)
    print(p.is_alive())  # 判断进程是否存活
    print('gun')

僵尸进程与孤儿进程
    
父进程回收子进程资源的两种方式
       1.join方法
       2.父进程正常死亡
 所有的进程都会步入僵尸进程
              
  孤儿进程
        子进程没死 父进程意外死亡           
          针对linux会有儿童福利院(init) 如果父进程意外死亡他所创建的子进程都会被福利院收养

守护进程

from multiprocessing import Process
import time
def test(name):
    print('%s'%name)
    time.sleep(1)
    print('%s'%name)
if __name__ == '__main__':
    p = Process(target=test,args=('egon',))
    p.daemon = True   # 将该进程设置为守护进程
    p.start()
    time.sleep(1)
    print('bye')

互斥锁
        当多个进程操作同一份数据的时候 会造成数据的错乱
        这个时候必须加锁处理
            将并发变成串行
                虽然降低了效率但是提高了数据的安全
            注意:
                1.锁不要轻易使用 容易造成死锁现象
                2.只在处理数据的部分加锁 不要在全局加锁
        
        锁必须在主进程中产生 交给子进程去使用

from multiprocessing import Process,Lock
import time
import json
def search(i):
    with open('data','r',encoding='utf-8')as f:
        data = f.read()
    t_d = json.loads(data)
    print('用户%s查询余票%s'%(i,t_d.get('ticket')))
def buy(i):
    with open('data','r',encoding='utf-8')as f:
        data = f.read()
    t_d = json.loads(data)
    time.sleep(1)
    if t_d.get('ticket') > 0:
        t_d['ticket'] -= 1
        with open('data','w',encoding='utf-8')as f:
            json.dump(t_d,f)
        print('抢票成功')
    else:
        print('没票了')
def run(i,mutex):
    search(i)
    mutex.acquire()  # 抢锁
    buy(i)
    mutex.release()  #释放锁
if __name__ == '__main__':
    mutex = Lock()   #生成一把锁
    for i in range(10):
        p = Process(target=run,args=(i,mutex))
        p.start()

data文本文档
{"ticket": 0}

猜你喜欢

转载自www.cnblogs.com/zrh-960906/p/11329407.html