进程

简介: 进程

多任务的执行方式

1.并发     (交替运行)


2.并行    (同时运行)

任务数大于内核数 并发执行
任务数小于等于内核数 并行执行

图片

进程的介绍

 在Python程序中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式。


图片

                                            进程的概念


图片
一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说每启

动一个进程,操作系统都会给其分配一定的运行资源(内存资源)

保证进程的运行。

进程,一个进程默认有一个线程,进程里面可以创建多个线程,
线程是依附在进程里面的,没有进程就没有线程。

多进程的使用

导入进程包

import multiprocessing
import time

跳舞任务

def dance():

for i in range(5):
    print("跳舞中...")
    time.sleep(0.2)

唱歌任务

def sing():

for i in range(5):
    print("唱歌中...")
    time.sleep(0.2)

if name == '__main__':

# 创建跳舞的子进程
# group: 表示进程组,目前只能使用None
# target: 表示执行的目标任务名(函数名、方法名)
# name: 进程名称, 默认是Process-1, .....
dance_process = multiprocessing.Process(group=None, target=dance, name= "myprogress1")
sing_process = multiprocessing.Process(target=sing)

# 启动子进程执行对应的任务
dance_process.start()
sing_process.start()

获取进程编号

导入进程包

import multiprocessing
import time
import os

跳舞任务

def dance():

# 获取当前进程(子进程)编号
dance_process_pid = os.getpid()
print("dance_process_pid:", dance_process_pid, multiprocessing.current_process())
# 获取当前进程的父进程编号
dance_process_parent_pid = os.getppid()
print("dance_process的父进程编号是:", dance_process_parent_pid)
for i in range(5):
    print("跳舞中...")
    time.sleep(0.2)

    # 扩展:根据进程编号强制杀死指定进程
    os.kill(dance_process_pid, 9)

唱歌任务

def sing():

sing_process_parent_pid = os.getppid()
print("sing_process_parent_pid的父进程编号是:", sing_process_parent_pid)
for i in range(5):
    print("唱歌中...")
    time.sleep(0.2)

获取当前进程(主进程)编号

main_process_pid = os.getpid()

print("main_process_id:", main_process_pid, multiprocessing.current_process())

if name == '__main__':

# 创建跳舞的子进程
# group: 表示进程组,目前只能使用None
# target: 表示执行的目标任务名(函数名、方法名)
# name: 进程名称, 默认是Process-1, .....
dance_process = multiprocessing.Process(group=None, target=dance, name= "my_process1")
sing_process = multiprocessing.Process(target=sing, name='my_process2')

# 启动子进程执行对应的任务
dance_process.start()
sing_process.start()



进程执行中带有参数

Progress类执行任务并给任务传参数有两种方式:

. args表示以元组的方式给执行任务传参

. kwargs表示以字典方式给执行任务传参

import multiprocessing

显示任务

def show_info(name, age):

print(name, age)

创建子进程

以元组方式传参,元组里面的元素顺序要和函数里面的参数顺序保持一致

sub_process = multiprocessing.Process(target=show_info, args=("hekang", 22))

sub_process = multiprocessing.Process(target=show_info, kwargs={'name':'杨凯文', 'age': 20})

以字典方式传参,字典里面的key要和函数里面的参数名保持一致,没有顺序要求

启动进程

if name == '__main__':

sub_process.start()

一个参数用元组传,一个参数用字典传

sub_process = multiprocessing.Process(target=show_info, args=("hekang",), kwargs={"age"=22}

进程之间不共享全局变量

import multiprocessing
import time

g_list = list() # => []

添加数据

def add_data():

for i in range(3):
    # 因为列表是可变类型,可以在原有内存的基础上修改数据,并且修改后内存地址不变
    # 所以不需要加global 申明
    # 加上global 表示申明要修改全局变量的内存地址
    g_list.append(i)
    print("added:", i)
    time.sleep(0.2)

读取数据

def read_data():

print(g_list)

添加数据的子进程

add_process = multiprocessing.Process(target=add_data)

读取数据的子进程

read_process = multiprocessing.Process(target=read_data)
if name == '__main__':

add_process.start()
read_process.start()

运行结果

added: 0

[]

added: 1

added: 2

遇到一个不太理解的Tracedback

当上面的代码

if name == '__main__':

add_process.start()
read_process.start()
将if name == '__main__':

去掉调用的时候报错

RuntimeError:

    An attempt has been made to start a new process before the

    current process has finished its bootstrapping phase.



    This probably means that you are not using fork to start your

    child processes and you have forgotten to use the proper idiom

    in the main module:



        if __name__ == '__main__':

            freeze_support()

            ...

    The "freeze_support()" line can be omitted if the program

    is not going to be frozen to produce an executable.

简单翻译下:

RuntimeError:

在当前进程完成了他的引导阶段之前试图去启动一个新进程。

这可能是表示你没有用fork方法启动子进程,并且你忘了用正确的姿势在main模块中:

if name == '__main__':

            freeze_support()

            ...

如果程序不会被冻结以生成可执行文件The "freeze_support()" 这行代码可以被忽略

至于具体为什么,根本原因,也没完全理解,大致就是windows创建进程没有fork方法,默认是spawn,而linux创建进程默认是fork方法。为了什么进程保护,代码必须放在if name == '__main__':下面。想要完全理解估计还要深入理解进程的概念,什么僵尸进程,孤儿进程类吧。

解决方法

加 if name == '__main__':

当.py文件被直接运行时,if name == '__main__'之下的代码块将被运行;

当.py文件以模块形式被导入时,if name == '__main__'之下的代码块不被运行。

相关文章
|
开发者
文件蜈蚣,一款免费开源比迅雷还良心的全协议下载神器
说到下载工具,相信很多人都在使用大名鼎鼎的 IDM 下载神器,优点众多:支持多线程下载,支持网页的视频嗅探下载,不过它支持的协议比较少,比如不支持 BT、ed2k、thunder 下载等;
1164 0
文件蜈蚣,一款免费开源比迅雷还良心的全协议下载神器
|
弹性计算 Unix 索引
人工智能技术与应用试题
人工智能技术与应用试题练习。
352 0
|
云安全 运维 监控
课时11:阿里云安全产品之安骑士
阿里云安骑士是一款领先的主机防护产品,致力于构建全面高效的安全防护体系。它通过轻量级Agent、实时监控、集中管理和情报共享等优势,帮助企业提前发现并修复高危漏洞,防范病毒入侵和数据泄露,确保服务器安全稳定运行。尤其在漏洞管理方面,安骑士提供一键修复功能,极大提高了响应速度,有效应对各类网络威胁。目前已为37%的中国互联网企业提供安全保障。
461 0
|
存储 人工智能 自然语言处理
阿里云Elasticsearch AI场景语义搜索最佳实践
本文介绍了如何使用阿里云Elasticsearch结合搜索开发工作台搭建AI语义搜索。
18127 68
|
安全 网络安全 网络架构
电脑提示“Waiting for Device”的解决方案
电脑提示“Waiting for Device”的解决方案
1224 4
|
XML 数据可视化 C语言
001 Qt_从零开始创建项目
本文是Qt专栏的第一篇,介绍了如何创建一个Qt项目。
487 4
|
安全 编译器 C语言
C语言常量的定义与使用的注意点
在 C 语言中,常量是在程序运行期间值不变的量,通过字面值、`#define` 或 `const` 关键字定义。字面常量直接在代码中表示固定值,如整数 `100`、浮点数 `3.14`、字符 `'A'` 和字符串 `"Hello, World!"`;`#define` 用于定义宏,如 `#define PI 3.14159`;`const` 则定义不可变变量,如 `const int daysInWeek = 7`。常量可用于数组大小、循环边界等场景,并能提升代码的可读性和可维护性。使用时需注意作用域、类型安全和命名,避免直接使用数字(魔法数字)。
|
JavaScript Python
Python量化择时的技术指标函数
Python量化择时的技术指标函数
626 0
|
开发者
Markdown:解放排版,简洁高效的文字创作神器!
Markdown 是一种轻量级标记语言,以易读易写著称,常用于生成 HTML 页面。其简洁的语法加速了排版,尤其在写作、博客和文档领域广泛应用。虽然不擅长复杂排版,但能轻松实现字体大小调整、插入表格、图片和超链接等。Markdown 通过键盘快捷操作,避免了 Word 等软件的繁琐设置。本文将深入讲解 Markdown 语法,助你提升效率。Markdown 适合快速学习,兼容各种文本编辑器,支持导出多种格式,广泛应用于 GitHub 和多个在线平台。
729 0
|
传感器 前端开发 JavaScript
前端
前端
625 3

热门文章

最新文章