zoukankan      html  css  js  c++  java
  • 进程对象及其其他方法+守护进程+僵尸进程与孤儿进程+进程间IPC通信

    """
    进程对象以及其他方法

    p.terminate() # 杀死子进程
    print(p.is_alive()) # 判断当前子进程是否存活
    """





    from multiprocessing import Process,current_process
    import time
    import os

    def task():
    print('%s is running 当前进程的id号 ' % current_process().pid) # 查看当前进程的id号
    print('%s is running当前进程的id号' % os.getpid()) # 查看当前进程的id号
    print('%s is running 当前进程的父进程的id号' % os.getppid()) # 查看当前进程的父进程的id号
    time.sleep(3)
    print('%s is end 当前进程的ID号' % current_process().pid)
    print('%s is end 当前进程的ID号' % os.getpid())


    if __name__ == '__main__':
    p = Process(target=task)
    p.start()
    print(p.name)
    p.terminate() # 杀死子进程
    time.sleep(0.1)
    print(p.is_alive()) # 判断当前子进程是否存活
    # print('主:%s'%current_process().pid)
    # print('主:%s'%os.getpid())
    print('主:%s' % os.getppid())
    print(current_process().name)



    守护进程

    from multiprocessing import Process
    import time


    def task(name):
    print('%s 还活着' % name)
    time.sleep(3)
    print('%s 正在死亡' % name)


    if __name__ == '__main__':
    p = Process(target=task,args=('egon总管',))
    # p.daemon = True # 将进程p设置为当前主进程的守护进程
    p.start()
    # p.daemon = True 一定要写在p.start之前
    time.sleep(1)
    print('皇帝jason驾崩了')

    """
    当没有设置守护进程时,程序的运行结果如下
    egon总管 还活着
    皇帝jason驾崩了
    egon总管 正在死亡

    Process finished with exit code 0


    当设置了守护进程之后,程序的运行结果如下
    egon总管 还活着
    皇帝jason驾崩了

    Process finished with exit code 0

    也就是说,当一个子进程P,有这样一行代码: p.daemon = True
    也就是将进程p设置为当前主进程的守护进程
    一旦被设置成了守护进程,那么当主进程结束的时候,守护进程不管有没有执行结束,
    都立刻停止运行,直接结束
    也就是守护进程是守护主进程的,当然也可以用来守护其他进程,一旦他守护的进程死亡了
    他自己也跟着直接死亡陪葬




    """




    """
    僵尸进程
    僵尸进程就是已经结束了,但是还没有被回收资源的进程,也就是已经死了还没有死透的进程
    当父进程永远不死 并且不调用join方法回收子进程的资源 还在源源不断的创建新的子进程
    每个进程都占据了一个PID号,而总的PID号是有限的,僵尸进程虽然已经释放了大部分的资源,但是PID号等
    还没有回收,一直占据着,所以,后面开新的进程就得用新的PID号,
    因此僵尸进程是有害的,我们应该在每一个进程结束之后,主动回收他的PID号,以及其他资源

    但是,如何回收呢???
    就是直接将这个父进程直接杀死
    p.terminate() # 杀死父进程P
    这样所有的僵尸进程所占据的资源也就会被直接回收了

    孤儿进程
    子进程还没有运行结束的时候 主进程意外死亡,这样的子进程叫做孤儿进程
    但是孤儿进程是无害的,会有init来接管所有的孤儿进程,并在进程结束之后回收相应的资源,


    ps aux |grep "Z"查看僵尸进程
    """



    """
    互斥锁:

    多个进程同一时间操作同一份数据的时候会造成数据的错乱
    如何解决这一现象?
    锁:互斥锁
    多个人抢一个厕所的药匙,抢到钥匙的人先进行操作,在他进行操作的时候,其他人不得操作该数据,只能等待
    等待这个人操作完了之后,释放钥匙,剩下的人继续抢钥匙,抢到的人继续进行操作,一个一个的来,

    互斥锁特点
    1.牺牲了程序的执行效率但是保证了数据的安全
    2,互斥锁会将并发变成串行
    3.互斥锁应该在主进程中产生 交给子进程去使用
    ps:你自己千万不要随意处理锁的问题, 处理不得当会造成死锁现象


    """
    """
    举例:购票系统
    假设现在有多个人在抢票,首先他们查票,查到票数大于0,那就去购买,将票数减1 修改数据,
    我们将功能分成这两个部分:
    1.查票:查询票的剩余数量
    2.买票:
    1.查票:还得再次查看一下,因为可能上一秒查看还有票,下一秒买的时候就没有了
    2.买票:链接数据库,将数据票数修改减去相应的数量

    具体实现如下:
    """
    from multiprocessing import Process, Lock # Lock就是锁
    import json
    import time
    import random


    def check():
    with open(file='ticket', mode='rt', encoding='utf-8') as f:
    data = json.load(f)
    print('当前余票:%s' % data.get("ticket"))


    def buy(name):
    with open('ticket', encoding='utf-8') as f:
    data = json.load(f)
    # 模拟网络延迟
    time.sleep(random.randint(1, 3))
    if data.get('ticket') > 0:
    data['ticket'] -= 1
    with open('ticket', 'w', encoding='utf-8') as f:
    json.dump(data, f)
    print('%s抢票成功' % name)
    else:
    print('没票了 回不了家了!')


    def run(name, mutex):
    check()
    mutex.acquire() # 买之前得先抢锁,抢到锁之后才能买,没有抢到锁的不能买
    buy(name)
    mutex.release() # 买完之后释放锁


    if __name__ == '__main__':
    mutex = Lock() # 产生了一把
    for i in range(10):
    p = Process(target=run, args=('子进程:%s' % i, mutex))
    p.start()
  • 相关阅读:
    博客园
    hdu 2071 Max Num
    函数的可选参数
    JqueryUI的使用方法
    [转]淘宝网的设计流程
    hover!= mouseover+mouseout。但hover=mouseenter + mouseleave
    转:理解Progressive enhancement
    jQuery对象和DOM对象的区别
    JS字符串的slice和splice
    内家武功招数
  • 原文地址:https://www.cnblogs.com/1832921tongjieducn/p/11312581.html
Copyright © 2011-2022 走看看