python语言基础-6 多任务-6.1 进程-6.1.1 进程模块

部署运行你感兴趣的模型镜像

声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。

6.1 进程

6.1.1 进程模块(参考链接:https://www.jianshu.com/p/91d8657f72ba

在不同的平台/操作系统上,python实现多进程的方式不同:

  • 在Unix/Linux 中,可以使用os模块;

  • 在Windows中,可以使用multiprocessing模块(在Unix/Linux/Mac上也可以使用)。

(1)os模块

在Unix/Linux 中,通过fork()调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。

Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程:

import os
​
print('Process (%s) start...' % os.getpid())
# Only works on Unix/Linux/Mac:
pid = os.fork()
if pid == 0:
    print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
    print('I (%s) just created a child process (%s).' % (os.getpid(), pid))
    
    
'''
运行上面代码输出的结果为:
Process (876) start...
I (876) just created a child process (877).
I am child process (877) and my parent is 876.
'''

os.getpid()是os模块下常用的方法,用于获取调用该方法的进程的进程号。

(2)multiprocessing模块

由于Windows没有fork调用,os模块的fork()方法在Windows上无法运行,我们可以使用multiprocessing模块,其封装了底层复制进程的过程,Unix/Linux/Mac和Windows上都可以运行。

根据不同的平台, multiprocessing 支持三种启动进程的方法:

  • spawn:父进程启动一个新的Python解释器进程。子进程只会继承那些运行进程对象的 run() 方法所需的资源。特别是父进程中非必须的文件描述符和句柄不会被继承。相对于使用 fork 或者 forkserver,使用这个方法启动进程相当慢。可在Unix和Windows上使用,Windows上的默认设置。

  • fork:父进程使用 os.fork() 来产生 Python 解释器分叉。子进程在开始时实际上与父进程相同。父进程的所有资源都由子进程继承。请注意,安全分叉多线程进程是棘手的。只存在于Unix、Unix中的默认值。

  • forkserver:程序启动并选择forkserver启动方法时,将启动服务器进程。从那时起,每当需要一个新进程时,父进程就会连接到服务器并请求它分叉一个新进程。分叉服务器进程是单线程的,因此使用 os.fork() 是安全的。没有不必要的资源被继承。可在Unix平台上使用,支持通过Unix管道传递文件描述符。

接下来的进程调度中,我们主要使用multiprocessing模块进行操作。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值