热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Process的几个用法和守护进程

[TOC]Process的几个用法和守护进程一、Process的join用法话不多说,直接上代码二、Process的pid和ppid用法需要先导入os模块站在当前进程的角度:os.


目录




  • Process的几个用法和守护进程

    • 一、Process的 join用法

    • 二、Process的pid和ppid用法

      • 三、Process的name用法


    • 四、Process的is_alive的用法

    • 五、Process的terminate用法

    • 六、守护进程

    • 七、抢票小程序





Process的几个用法和守护进程

一、Process的 join用法


话不多说,直接上代码


join 用法一 ,单进程
from multiprocessing import Process
import time

def foo():
print('子进程 start')
time.sleep(2)
print('子进程 end')

if __name__ == '__main__':
p = Process(target=foo)
p.start()
# 核心需求就是想让子进程执行完,再执行主进程的print,time有弊端
# time.sleep(5)
p.join() # 在这阻塞住,主进程等待该子进程结束,然后再往下执行,(了解:内部会调用wait())
print('主进程')

# join用法二(并发)
from multiprocessing import Process
import time

def foo(x):
print('子进程 start')
time.sleep(x)
print('子进程 end')

if __name__ == '__main__':
p1 = Process(target=foo,args=(1,))
p2 = Process(target=foo,args=(2,))
p3 = Process(target=foo,args=(3,))
start = time.time()
p1.start()
p2.start()
p3.start() # 这几个相当于并发
# 核心需求就是想让子进程执行完,再执行主进程的print,time有弊端
# time.sleep(5)
p1.join() # 在这阻塞住,主进程等待该子进程结束,然后再往下执行,(了解:内部会调用wait())
p2.join()
p3.join()
# 总时长:按照最长的时间计算多一点
end = time.time()
print(end-start)
print('主进程')

# join用法三(串行)
from multiprocessing import Process
import time

def foo(x):
print('子进程 start')
time.sleep(x)
print('子进程 end')

if __name__ == '__main__':
p1 = Process(target=foo,args=(1,))
p2 = Process(target=foo,args=(2,))
p3 = Process(target=foo,args=(3,))
start = time.time()
p1.start()
p1.join() # 在这阻塞住,主进程等待该子进程结束,然后再往下执行,(了解:内部会调用wait())
p2.start()
p2.join()
p3.start() # 这几个相当于并行
p3.join()

# 核心需求就是想让子进程执行完,再执行主进程的print,time有弊端
# time.sleep(5)
# 总时长:按照最长的时间计算多一点
end = time.time()
print(end-start)
print('主进程')

# 优化join用法二
from multiprocessing import Process
import time

def foo(x):
print(f'子进程{x} start')
time.sleep(x)
print(f'子进程{x} end')

if __name__ == '__main__':
start = time.time()
p_list = []
for i in range(1,4):
p = Process(target=foo, args=(i,))
p.start()
p_list.append(p)
for p in p_list:
p.join()
end = time.time()
print(end-start)
print('主进程')

二、Process的pid和ppid用法


需要先导入os模块


站在当前进程的角度:os.getpid()>>>>获取当前进程的pid


? os.getppid()>>>>获取当前进程的父进程的pid


? 子进程对象.pid>>>>获取当前进程的子进程pid


具体看以下代码


from multiprocessing import Process,current_process
import time,os
def task():
print('子进程 start')
print('在子进程中查看自己的pid',current_process().pid) # 在子进程查看自己pid方法一
print('在子进程中查看自己的pid',os.getpid()) # 在子进程查看自己pid方法二
print('在子进程中查看父进程的pid',os.getppid())
time.sleep(2)
print('子进程 end')

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

在主进程查看子进程的pid 1928

主进程的pid 2900

主进程的父进程pid 1008

主进程

子进程 start

在子进程中查看自己的pid 1928

在子进程中查看自己的pid 1928

在子进程中查看父进程的pid 2900

子进程 end


三、Process的name用法


这是用来查看进程名的


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)
p.start()
print(p.name)

Process-1

子进程 start


Process-1

子进程 end


四、Process的is_alive的用法


用来判断进程是否活着,结果是True或False


from multiprocessing import Process,current_process
import time
def foo():
print('子进程 start')
time.sleep(2)
print('子进程 end')

if __name__ == '__main__':
p = Process(target=foo)
p.start()
print(p.is_alive()) # 没运行完就活着 True
time.sleep(5)
print(p.is_alive()) # 代码运行完了就算死了 False
print('主进程')

True

子进程 start

子进程 end

False

主进程


五、Process的terminate用法


用来直接把进程终止(死掉)


from multiprocessing import Process,current_process
import time
def foo():
print('子进程 start')
time.sleep(50)
print('子进程 end')

if __name__ == '__main__':
p = Process(target=foo)
p.start()
p.terminate() # 给操作系统发了一个终止进程的请求
print(p.is_alive()) # 没运行完就活着 True
p.join() # 可以不等50秒,直接执行下面的
print(p.is_alive())

print('主进程')

True

False

主进程


六、守护进程


守护进程本质也是一个子进程,主进程的代码执行完毕,守护进程就直接结束


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

if __name__ == '__main__':
p = Process(target=foo)
p.daemon = True # 把这个子进程定义为了守护进程,只陪伴到打印主进程就结束
p.start()

print('主进程') # 这个执行完,主进程的代码就执行完毕,子进程就直接结束,

主进程


七、抢票小程序



from multiprocessing import Process
import json,time,os
def search():
time.sleep(1)
with open('db',mode='rt',encoding='utf-8') as fr:
res = json.load(fr)
print(f'还剩{res["count"]}张')

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

def task():
search()
get()

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

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

Process的几个用法和守护进程



推荐阅读
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
author-avatar
w3812127
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有