并发编程之Process的join和其它用法

目录

上节课内容回顾
一、Process的join用法
二、Process的其他用法
三、Process的name和is_alive(了解)
四、Process的terminal(了解)
五、守护进程
六、抢票小程序
上节课内容回顾
'''
操作系统
*****
串行:一个完完整整执行完再
并发:看起来是同时运行 单核
并行:真正的同时运行

多道技术:
空间复用:共用一个内存条,多个进程互相隔离,物理级别隔离。
时间复用:共用一个cpu


程序:躺在硬盘上的文件
进程:一个执行的程序,是一系列资源的总和
如何再我们的程序里开子进程。

尽量减少阻塞状态可以提升我们程序运行的效率


并发 = 保存状态+切换

'''

*****

开子进程 申请新的内存空间 把父进程的所有代码完整拷贝一份过去

from multiprocessing import Process

def task(x):

pass

if name == 'main':

p = Process(target=task,args=(45,))

p.start()

第二种开启子进程的方式不常用

from multiprocessing import Process

class Xx(Process):

def init(self,x):

super().__init__()

self.x = x

def run(self):

pass

p = Xx()

p.start()

验证内存空间彼此隔离

僵尸进程:父进程的子进程结束的时候父进程没有wait()情况下子进程会变成僵尸进程。

*****

父进程等着所有的子进程结束才会结束。

今日内容

孤儿进程(无害) *

一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

'''
情况1 无害
父进等着子进程都死,回收僵尸进程。

情况2 无害
父进程死了,子进程活着,都要被init进程接管并且回收。

情况3
父进程一直不死,造成了大量僵尸进程。占用了大量的pid号

pid号是有限的。
解决方案:
最直接的办法就是杀死父进程 。

'''

join的用法 *****

Process的其他小用法 *

掌握pid 和 ppid的查看方式 *****

守护进程

抢票小程序

Queue

一、Process的join用法
from multiprocessing import Process
import time
def foo():
print('进程 start ')
time.sleep(2.3)
print('进程 end ')

if name == 'main':
p = Process(target=foo)
p.start() #
# 核心需求就是
# time.sleep(5)
p.join() # 阻塞住主进程再等待子进程结束,然后再往下执行,(了解的是:内部会待用wait())
print('主')
二、Process的其他用法
from multiprocessing import Process,current_process
import time,os

def task():

print('子进程 start')
print('在子进程中查看自己的pid',current_process().pid) # 在子进程中查看自己的pid
print('在子进程中查看父进程的pid',os.getppid()) #
time.sleep(200)
print('子进程 end')

if name == 'main':

p = Process(target=task)
p.start()
print('在主进程查看子进程的pid',p.pid) # 一定要写在 start()之后
print('主进程的pid',os.getpid())
print('主进程的父进程pid',os.getppid())
print('主')

'''

记住这些就ok了 这个是要掌握的

角度 站在当前进程的角度

os.getpid()#获取当前进程的pid
os.getppid() #获取当前进程的父进程的pid
子进程对象.pid #获取当前进程的子进程pid

'''
三、Process的name和is_alive(了解)
from multiprocessing import Process,current_process
import time
def foo():
print('进程 start')
# print('--------------------- ',current_process().name)
time.sleep(2)
print('进程 end')

if name == 'main':
p = Process(target=foo)
# p2 = Process(target=foo)
# p3 = Process(target=foo,name='rocky')

p.start()
# p2.start()
# p3.start()
print(p.is_alive()) # True
time.sleep(5)
print(p.is_alive()) # 代码运行完了就算死了 False
# print(p.name)
# print(p2.name)
# print(p3.name)
print('主')

四、Process的terminal(了解)
from multiprocessing import Process,current_process
import time
def foo():
print('进程 start')
# print('--------------------- ',current_process().name)
time.sleep(50)
print('进程 end')

if name == 'main':
p = Process(target=foo)

p.start()
p.terminate() # 给操作系统发了一个请求
print(p.is_alive()) # True
p.join()
print(p.is_alive()) # False

print('主')

五、守护进程
'''
守护进程
守护--》伴随
本质也是一个子进程
主进程的代码执行完毕守护进程直接结束。但是此时主进程可能没有结束.
'''

from multiprocessing import Process
import time
def foo():
print('守护进程 start')
time.sleep(5)
print('守护进程 end')

if name == 'main':
p = Process(target=foo)
p.daemon = True # 把这个子进程定义为了守护进程
p.start()
time.sleep(2)
print('主')
六、抢票小程序
from multiprocessing import Process
import json,time,os

def search():
time.sleep(1) # 模拟网络io
with open('db.txt',mode='rt',encoding='utf-8') as f:
res = json.load(f)
print(f'还剩{res["count"]}')

def get():
with open('db.txt',mode='rt',encoding='utf-8') as f:
res = json.load(f)
# print(f'还剩{res["count"]}')
time.sleep(1) # 模拟网络io
if res['count'] > 0:
res['count'] -= 1
with open('db.txt',mode='wt',encoding='utf-8') as f:
json.dump(res,f)
print(f'进程{os.getpid()} 抢票成功')
time.sleep(1.5) # 模拟网络io
else:
print('票已经售空啦!!!!!!!!!!!')

def task():
search()
get()

if name == 'main':
for i in range(15):
p = Process(target=task)
p.start()
p.join()

为了保证数据的安全,要牺牲掉效率.

转载于:https://www.cnblogs.com/1012zlb/p/11545109.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值