linux高级命令之进程的注意点

news2024/9/23 13:27:08

进程的注意点

学习目标

  • 能够说出进程的注意点


1. 进程的注意点介绍

  1. 进程之间不共享全局变量

  1. 主进程会等待所有的子进程执行结束再结束

2. 进程之间不共享全局变量

import multiprocessing
import time

# 定义全局变量
g_list = list()


# 添加数据的任务defadd_data():for i in range(5):
        g_list.append(i)
        print("add:", i)
        time.sleep(0.2)

    # 代码执行到此,说明数据添加完成
    print("add_data:", g_list)


defread_data():
    print("read_data", g_list)


if __name__ == '__main__':
    # 创建添加数据的子进程
    add_data_process = multiprocessing.Process(target=add_data)
    # 创建读取数据的子进程
    read_data_process = multiprocessing.Process(target=read_data)

    # 启动子进程执行对应的任务
    add_data_process.start()
    # 主进程等待添加数据的子进程执行完成以后程序再继续往下执行,读取数据
    add_data_process.join()
    read_data_process.start()

    print("main:", g_list)

    # 总结: 多进程之间不共享全局变量

执行结果:

add: 0
add: 1
add: 2
add: 3
add: 4
add_data: [0, 1, 2, 3, 4]
main: []
read_data []

进程之间不共享全局变量的解释效果图:

3. 进程之间不共享全局变量的小结

  • 创建子进程会对主进程资源进行拷贝,也就是说子进程是主进程的一个副本,好比是一对双胞胎,之所以进程之间不共享全局变量,是因为操作的不是同一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已。

4. 主进程会等待所有的子进程执行结束再结束

假如我们现在创建一个子进程,这个子进程执行完大概需要2秒钟,现在让主进程执行0.5秒钟就退出程序,查看一下执行结果,示例代码如下:

import multiprocessing
import time


# 定义进程所需要执行的任务deftask():for i in range(10):
        print("任务执行中...")
        time.sleep(0.2)

if __name__ == '__main__':
    # 创建子进程
    sub_process = multiprocessing.Process(target=task)
    sub_process.start()

    # 主进程延时0.5秒钟
    time.sleep(0.5)
    print("over")
    exit()

    # 总结: 主进程会等待所有的子进程执行完成以后程序再退出

执行结果:

任务执行中...
任务执行中...
任务执行中...
over
任务执行中...
任务执行中...
任务执行中...
任务执行中...
任务执行中...
任务执行中...
任务执行中...

说明:

通过上面代码的执行结果,我们可以得知: 主进程会等待所有的子进程执行结束再结束

假如我们就让主进程执行0.5秒钟,子进程就销毁不再执行,那怎么办呢?

  • 我们可以设置守护主进程 或者 在主进程退出之前 让子进程销毁

守护主进程:

  • 守护主进程就是主进程退出子进程销毁不再执行

子进程销毁:

  • 子进程执行结束

保证主进程正常退出的示例代码:

import multiprocessing
import time


# 定义进程所需要执行的任务deftask():for i in range(10):
        print("任务执行中...")
        time.sleep(0.2)

if __name__ == '__main__':
    # 创建子进程
    sub_process = multiprocessing.Process(target=task)
    # 设置守护主进程,主进程退出子进程直接销毁,子进程的生命周期依赖与主进程# sub_process.daemon = True
    sub_process.start()

    time.sleep(0.5)
    print("over")
    # 让子进程销毁
    sub_process.terminate()
    exit()

    # 总结: 主进程会等待所有的子进程执行完成以后程序再退出# 如果想要主进程退出子进程销毁,可以设置守护主进程或者在主进程退出之前让子进程销毁

执行结果:

任务执行中...
任务执行中...
任务执行中...
over

5. 主进程会等待所有的子进程执行结束再结束的小结

  • 为了保证子进程能够正常的运行,主进程会等所有的子进程执行完成以后再销毁,设置守护主进程的目的是主进程退出子进程销毁,不让主进程再等待子进程去执行

  • 设置守护主进程方式: 子进程对象.daemon = True

  • 销毁子进程方式: 子进程对象.terminate()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/355560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

snakeyaml自定义pojo写入yml文件时属性字段排序问题

snakeyaml采用LinkedHashMap保存对象,最后写入yml文件的时候,可以按照存入的顺序写入yml,如果采用自定义pojo,虽然可以写入yml,但是属性默认是按照字母顺序进行写入的。 如下所示,定义一个User实体&#xf…

kafka生产者事务踩坑记录

1. 背景 公司需要迁移一个老 spark 项目,之前是消费阿里 LogStore 中的实时数据,处理之后将结果落库。使用的是 spark streaming,batch 时间为 2 分钟。迁移后,需要将 LogStore 切换为 kafka,涉及到了对代码的改动。公…

常见的数据结构

栈(stack) 栈( stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶(top)。它是后进先出(LIFO)的。对栈的基本操作只有 push&#x…

linux高级命令之线程

线程学习目标能够知道线程的作用1. 线程的介绍在Python中,想要实现多任务除了使用进程,还可以使用线程来完成,线程是实现多任务的另外一种方式。2. 线程的概念线程是进程中执行代码的一个分支,每个执行分支(线程&#…

macos 下载 macOS 系统安装程序及安装U盘制作方法

01 下载 macOS 系统安装程序的方法 本文来自: https://discussionschinese.apple.com/docs/DOC-250004259 简介 Mac 用户时不时会需要下载 macOS 的安装程序,目的不同,或者升级或者降级,或者研究或者收藏。为了方便不同用户,除…

设计模式之委派模式与模板模式详解和应用

目录1 委派模式1.1 目标1.2 内容定位1.3 定义1.4 委派模式的应用场景1.5 委派模式在业务场景中的应用1.6 委派模式在源码中的体现1.6.1 双亲委派模型1.6.2 常用代理执行方法 invoke1.6.3 Spring loC中 在调用 doRegisterBeanDefinitions()1.6.4 SpringMVC 的DispatcherServlet1…

python基于vue微信小程序的校园闲置二手跳蚤商城的设计与实现

在当今社会的高速发展过程中,产生的劳动力越来越大,提高人们的生活水平和质量,尤其计算机科技的进步,数据和信息以人兴化为本的目的,给人们提供优质的服务,其中网上购买二手商品尤其突出,使我们的购物方式发生巨大的改变。而线上购物,不仅需要在硬件上为人们提供服务网上购物,而…

尚医通 (十七)手机登录

目录一、登录需求分析二、搭建service-user模块三、登录接口实现1、添加service接口与实现2、添加Mapper接口3、添加Controller方法四、手机验证码登录(生成token)1、使用JWT进行跨域身份验证1.1 传统用户身份验证1.2 解决方案2、JWT介绍3、整合JWT4、单…

Minecraft服务端配置

✨✨前言 ✨✨ 我的世界大家肯定都不陌生,在网易拿下中国区的代理后,很多小伙伴也是都转向了网易版我的世界,网易版我的世界可以说已经做是的十分全面了,使用起来也十分方便,一部分小伙伴也是看重了网易庞大的玩家数量…

使用uniapp创建小程序和H5界面

uniapp的介绍可以看官网,接下来我们使用uniapp创建小程序和H5界面,其他小程序也是可以的,只演示创建这2个,其实都是一套代码,只是生成的方式不一样而已。 uni-app官网 1.打开HBuilder X 选择如图所示,下…

1. Unity的下载与安装

1. 下载 Unity Hub: unity hub是unity编辑器的一个管理工具,负责平时的unity项目创建和管理,以及unity编辑器的安装等 首先在unity官网网址链接,点击左下角的DownLoad Unity图标,如下图: 进入下一个页面,…

LinkedHashMap实现LRU算法

目录LRU 简介LinkedHashMap的使用手写LRU缓存淘汰算法LRU 简介 LRU 是 Least Recently Used 的缩写,这种算法认为最近使用的数据是热门数据,下一次很大概率将会再次被使用。而最近很少被使用的数据,很大概率下一次不再用到。当缓存容量的满时…

show profile和trance分析SQL

目录 一.show profile分析SQL 二.trance分析优化器执行计划 一.show profile分析SQL Mysql从5.0.37版本开始增加了对show profiles和show profile语句的支持。show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。。 通过have_profiling参数,能够…

J东滑块分析

内容仅供参考学习 欢迎朋友们V一起交流: zcxl7_7 目标 网址:案例地址 J东登录页面会有滑块,直接用来研究 分析 模拟一次触发滑块验证请求(如图) 有2个重要请求,一个是g.html,一个是s.html。其中很明确的就是g是获…

【100个 Unity实用技能】 | Unity 通过自定义菜单将资源导出

Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

C++——二叉树的前序遍历||中序遍历||后序遍历 非递归算法

目录二叉树的前序遍历,非递归迭代实现二叉树的中序遍历 ,非递归迭代实现二叉树的后序遍历 ,非递归迭代实现二叉树的前序遍历,非递归迭代实现 题目链接 思路: 将任何一颗树分成两个部分,一部分是左路节点&a…

用Three.js搭建的一个艺术场景

本文翻译自于Medium,原作者用 Three.js 创建了一个“Synthwave 场景”,效果还不错,在此加上自己的理解,记录一下。在线Demo. 地形构建 作者想要搭建一个中间平坦、两侧有凹凸山脉效果并且能够一直绵延不断的地形,接下…

Quartz组件任务调度管理

Quartz什么是Quartzquartz:石英钟的意思是一个当今市面上流行的高效的任务调度管理工具所谓"调度"就是制定好的什么时间做什么事情的计划由OpenSymphony开源组织开发Symphony:交响乐是java编写的,我们使用时需要导入依赖即可为什么需要Quartz所谓"调度"就是…

18:CTK 总结篇(FAQ)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 经过了几个月的艰苦奋战,终于到了最后一节啦,是不是和我一样,心里有点儿小激动! 回顾之前的章节,从初级 -> 进阶 -> 高级,我们针对 CTK 做了详细的分类讲解。希望通过这些知识,大家能对模块化…

管理会计报告和财务报告的区别

财务会计报告是给投资人看的,可以反映公司总体的盈利能力。不过,我们回顾一下前面“第一天”里面提到的问题。如果你是公司的产品经理,目前有三个产品在你的管辖范围内。上级给你一笔新的资金,这笔资金应该投到哪个产品上&#xf…