进程 与 并发(进程打开方式,互斥锁)

进程:

  正在运行的程序,用来描述程序执行的过程(虚拟概念)

程序:指的是一堆代码

进程:程序的执行过程

 

操作系统:

  用于协调/管理/控制,控制计算机

  1.能够将复杂的硬件封装成简单的接口给用户使用

  2.能够将竞争的任务变得有序

 

并发:多个任务看起来是同时运行的

串行:必须把一个任务完整的运行完,才能执行下一个任务

 

多道技术:

  时间上的复用:多个程序复用CPU的时间

  空间上的复用:多个程序复用内存空间

    一个任务占用cpu时间过长会被操作系统强行夺走CPU的执行权限:比起串行执行效率更低

    一个任务遇到io操作也会被操作系统强行夺走cpu的执行权限:比起串行执行效率更低

 

进程打开的两种方式:

方式1:

from multiprocessing import Process
import time

def task(name):
print('开始',name)
time.sleep(1)
print('finish...')

if __name__ == '__main__':
p = Process(target=task,args=('wxx',))
p.start() #向操作系统发送了一个开启子进程的请求,实际上是在调task
print('主进程...')
from multiprocessing import Process
import time

class auth(Process):
    def __init__(self,name):
        super().__init__()
        self.name = name

    def run(self):
        print('开始:',self.name)
        time.sleep(3)
        print('finish...')

if __name__ == '__main__':
    p = auth('wxx')
    p.start() #向操作系统发送了一个开启子进程的请求,实际上是在调task
    print('主进程...')
方式2

 

join 方法 

  join 让主进程在原地等待,子进程运行完毕才会执行主进程

from multiprocessing import Process
import time
def task(name):
    print('start:',name)
    time.sleep(2)
    print('finish...')


if __name__ == '__main__':
    p_list= []
    for i in range(3):
        p = Process(target=task,args=(i,))
        p_list.append(p)
        p.start()
    for p in p_list:
        p.join()
    print('主进程...')
代码示例

 互斥锁

from multiprocessing import Process,Lock
import json,time
def checker(name):
    with open('db.json','rt',encoding=('utf-8')) as f:
        dic = json.load(f)
        time.sleep(1)
        print('%s 查看还剩余票 %s'%(name,dic['count']))

def get(name):
    with open('db.json','rt',encoding=('utf-8')) as f:
        dic = json.load(f)
    if dic['count'] > 0:
        dic['count'] -= 1
        print('%s 购买了机票' %name)
        with open('db.json', 'wt', encoding=('utf-8')) as wf:
            json.dump(dic,wf)
    else:print('没有票了')

def task(name,mack):
    checker(name)
    mack.acquire()
    get(name)
    mack.release()

if __name__=='__main__':
    mack = Lock()
    for i in range(10):
        p = Process(target=task,args=('name %s' %i,mack))
        p.start()
代码示例

 

posted @ 2018-09-04 18:32  星牧  阅读(375)  评论(0编辑  收藏  举报