<strong>"""<br></br>进程对象以及其他方法<br></br><br></br>p.terminate()  # 杀死子进程<br></br>print(p.is_alive())  # 判断当前子进程是否存活<br></br>"""<br></br><br></br><br></br><br></br><br></br><br></br>from multiprocessing import Process,current_process<br></br>import time<br></br>import os<br></br><br></br>def task():<br></br>    print('%s is running 当前进程的id号 ' % current_process().pid)  # 查看当前进程的id号<br></br>    print('%s is running当前进程的id号' % os.getpid())  # 查看当前进程的id号<br></br>    print('%s is running 当前进程的父进程的id号' % os.getppid())  # 查看当前进程的父进程的id号<br></br>    time.sleep(3)<br></br>    print('%s is end  当前进程的ID号' % current_process().pid)<br></br>    print('%s is end 当前进程的ID号' % os.getpid())<br></br><br></br><br></br>if __name__ == '__main__':<br></br>    p = Process(target=task)<br></br>    p.start()<br></br>    print(p.name)<br></br>    p.terminate()  # 杀死子进程<br></br>    time.sleep(0.1)<br></br>    print(p.is_alive())  # 判断当前子进程是否存活<br></br>    # print('主:%s'%current_process().pid)<br></br>    # print('主:%s'%os.getpid())<br></br>    print('主:%s' % os.getppid())<br></br>    print(current_process().name)<br></br><br></br></strong><br></br><br></br><strong>守护进程</strong><br></br><br></br>
<strong>from multiprocessing import Process<br></br>import time<br></br><br></br><br></br>def task(name):<br></br>    print('%s 还活着' % name)<br></br>    time.sleep(3)<br></br>    print('%s 正在死亡' % name)<br></br><br></br><br></br>if __name__ == '__main__':<br></br>    p = Process(target=task,args=('egon总管',))<br></br>    # p.daemon = True  # 将进程p设置为当前主进程的守护进程<br></br>    p.start()<br></br>    # p.daemon = True  一定要写在p.start之前<br></br>    time.sleep(1)<br></br>    print('皇帝jason驾崩了')<br></br><br></br>"""<br></br>当没有设置守护进程时,程序的运行结果如下<br></br>egon总管 还活着<br></br>皇帝jason驾崩了<br></br>egon总管 正在死亡<br></br><br></br>Process finished with exit code 0<br></br><br></br><br></br>当设置了守护进程之后,程序的运行结果如下<br></br>egon总管 还活着<br></br>皇帝jason驾崩了<br></br><br></br>Process finished with exit code 0<br></br><br></br>也就是说,当一个子进程P,有这样一行代码: p.daemon = True  <br></br>也就是将进程p设置为当前主进程的守护进程<br></br>一旦被设置成了守护进程,那么当主进程结束的时候,守护进程不管有没有执行结束,<br></br>都立刻停止运行,直接结束<br></br>也就是守护进程是守护主进程的,当然也可以用来守护其他进程,一旦他守护的进程死亡了<br></br>他自己也跟着直接死亡陪葬<br></br><br></br><br></br><br></br><br></br>"""</strong><br></br><br></br><br></br>
<br></br><strong>"""<br></br>僵尸进程<br></br>    僵尸进程就是已经结束了,但是还没有被回收资源的进程,也就是已经死了还没有死透的进程<br></br>    当父进程永远不死 并且不调用join方法回收子进程的资源 还在源源不断的创建新的子进程<br></br>    每个进程都占据了一个PID号,而总的PID号是有限的,僵尸进程虽然已经释放了大部分的资源,但是PID号等<br></br>    还没有回收,一直占据着,所以,后面开新的进程就得用新的PID号,<br></br>    因此僵尸进程是有害的,我们应该在每一个进程结束之后,主动回收他的PID号,以及其他资源<br></br><br></br>    但是,如何回收呢???<br></br>    就是直接将这个父进程直接杀死<br></br>    p.terminate()  # 杀死父进程P<br></br>    这样所有的僵尸进程所占据的资源也就会被直接回收了<br></br><br></br>孤儿进程<br></br>    子进程还没有运行结束的时候 主进程意外死亡,这样的子进程叫做孤儿进程<br></br>    但是孤儿进程是无害的,会有init来接管所有的孤儿进程,并在进程结束之后回收相应的资源,<br></br><br></br><br></br>ps aux |grep "Z"查看僵尸进程<br></br>"""</strong><br></br><br></br><br></br>
<strong>"""<br></br>互斥锁:<br></br><br></br>多个进程同一时间操作同一份数据的时候会造成数据的错乱<br></br>如何解决这一现象?<br></br>    锁:互斥锁<br></br>    多个人抢一个厕所的药匙,抢到钥匙的人先进行操作,在他进行操作的时候,其他人不得操作该数据,只能等待<br></br>    等待这个人操作完了之后,释放钥匙,剩下的人继续抢钥匙,抢到的人继续进行操作,一个一个的来,<br></br><br></br>互斥锁特点<br></br>    1.牺牲了程序的执行效率但是保证了数据的安全<br></br>    2,互斥锁会将并发变成串行<br></br>    3.互斥锁应该在主进程中产生 交给子进程去使用<br></br>ps:你自己千万不要随意处理锁的问题,  处理不得当会造成死锁现象<br></br><br></br><br></br>"""<br></br>"""<br></br>举例:购票系统<br></br>    假设现在有多个人在抢票,首先他们查票,查到票数大于0,那就去购买,将票数减1 修改数据,<br></br>    我们将功能分成这两个部分:<br></br>1.查票:查询票的剩余数量<br></br>2.买票:<br></br>    1.查票:还得再次查看一下,因为可能上一秒查看还有票,下一秒买的时候就没有了<br></br>    2.买票:链接数据库,将数据票数修改减去相应的数量<br></br><br></br>具体实现如下:<br></br>"""<br></br>from multiprocessing import Process, Lock  # Lock就是锁<br></br>import json<br></br>import time<br></br>import random<br></br><br></br><br></br>def check():<br></br>    with open(file='ticket', mode='rt', encoding='utf-8') as f:<br></br>        data = json.load(f)<br></br>    print('当前余票:%s' % data.get("ticket"))<br></br><br></br><br></br>def buy(name):<br></br>    with open('ticket', encoding='utf-8') as f:<br></br>        data = json.load(f)<br></br>    # 模拟网络延迟<br></br>    time.sleep(random.randint(1, 3))<br></br>    if data.get('ticket') > 0:<br></br>        data['ticket'] -= 1<br></br>        with open('ticket', 'w', encoding='utf-8') as f:<br></br>            json.dump(data, f)<br></br>        print('%s抢票成功' % name)<br></br>    else:<br></br>        print('没票了 回不了家了!')<br></br><br></br><br></br>def run(name, mutex):<br></br>    check()<br></br>    mutex.acquire()  # 买之前得先抢锁,抢到锁之后才能买,没有抢到锁的不能买<br></br>    buy(name)<br></br>    mutex.release()  # 买完之后释放锁<br></br><br></br><br></br>if __name__ == '__main__':<br></br>    mutex = Lock()  # 产生了一把<br></br>    for i in range(10):<br></br>        p = Process(target=run, args=('子进程:%s' % i, mutex))<br></br>        p.start()<br></br></strong>

标签: 进程, 守护, IPC, Process

相关文章推荐

添加新评论,含*的栏目为必填