进程对象及其其他方法+守护进程+僵尸进程与孤儿进程+进程间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()
原文地址:https://www.cnblogs.com/1832921tongjieducn/p/11312581.html