zoukankan      html  css  js  c++  java
  • 进程 与 并发(进程打开方式,互斥锁)

    进程:

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

    程序:指的是一堆代码

    进程:程序的执行过程

    操作系统:

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

      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()
    代码示例
  • 相关阅读:
    Boost中timer的简易用法
    poj 2586 Y2K Accounting Bug(贪心算法,水题一枚)
    Steps to Install Hadoop on CentOS/RHEL 6---reference
    nginx多进程模型之配置热加载---转
    C/C++ unit testing tools (39 found)---reference
    centos复制到另外一台电脑连不上网
    linux man使用方法 和centos安装中文man包 --转
    centos6.4使用man查找命令时,报错No manual entry for xxxx
    How to Install and Configure Nginx from Source on centos--转
    研磨设计模式之 策略模式--转
  • 原文地址:https://www.cnblogs.com/liu--huan/p/9587756.html
Copyright © 2011-2022 走看看